C# 工具提示内显示的Silverlight数据绑定图像

C# 工具提示内显示的Silverlight数据绑定图像,c#,asp.net,silverlight,tooltip,C#,Asp.net,Silverlight,Tooltip,这个问题是这个问题的后续问题 这是我的新问题,我一直在尝试获取一个工具提示,以便在我的silverlight应用程序的搜索结果中返回的文档预览时弹出。我已经链接了图像,它显示了正确的图像,但是它会在一个新的或单独的窗口中打开,而不是工具提示本身。这是我的密码 private void PPTImageToolTip(object sender, RoutedEventArgs e) { string docname = ((FrameworkElement)sender)

这个问题是这个问题的后续问题

这是我的新问题,我一直在尝试获取一个工具提示,以便在我的silverlight应用程序的搜索结果中返回的文档预览时弹出。我已经链接了图像,它显示了正确的图像,但是它会在一个新的或单独的窗口中打开,而不是工具提示本身。这是我的密码

private void PPTImageToolTip(object sender, RoutedEventArgs e)
    {
        string docname = ((FrameworkElement)sender).DataContext.ToString();
        string baseUri = "http://localhost:58904/ShowDocument.aspx?DocumentName=" + docname + "-ppt" + "&type=jpg";
        var hostingWindow = HtmlPage.Window;
        hostingWindow.Navigate(new Uri(baseUri, UriKind.Absolute), "_parent");
    }
设置为转到处理此操作的my ShowDocument.aspx页面

else if (File.Exists(strFullFilePath) && sType == "jpg")
                    {
                        fileStream = new FileStream(strFullFilePath, FileMode.Open, FileAccess.Read);
                        buffer = new byte[fileStream.Length];
                        fileStream.Read(buffer, 0, Convert.ToInt32(fileStream.Length));
                        try
                        {
                            Response.ClearHeaders();
                            Response.ClearContent();
                            Response.ContentType = "image/jpeg";
                            Response.BinaryWrite(buffer);

                        }
                        catch (Exception ex)
                        { }
                    }

我意识到它会转移到另一个“页面”,但我无法在工具提示中显示该图像或页面,而不是填充新窗口。这是因为我的HtmlPage.window代码吗?或者因为ShowDocument.aspx页面已被调用,无法回拨?是否有一个可行的解决方案,使图像填充到工具提示内?或者是否有方法将repsonse.redirect重定向到保存工具提示的silverlight控件中?

如果您的目标是在工具提示中显示图像(而不是在html窗口中),则以下操作将起作用:

首先是web服务(ashx)

然后从Silverlight客户端调用服务:

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
        WebClient client = new WebClient();
        client.OpenReadCompleted += (s, e) =>
            {
                using (Stream stream = e.Result)
                {
                    BitmapImage img = new BitmapImage();
                    img.SetSource(stream);

                    // Update MyImage.Source. Use the Dispatcher to ensure this happens on the UI Thread
                    Dispatcher.BeginInvoke(() =>
                        {
                            MyImage.Source = img;
                        });

                }
            };
        client.OpenReadAsync(new Uri(String.Format(BaseURL + "MyHandler.ashx")));
    }
}
最后是视图的xaml:

<Border x:Name="MyBorder" Width="100" Height="100" Background="Black">
        <ToolTipService.ToolTip>
            <Image x:Name="MyImage" />
        </ToolTipService.ToolTip>

</Border>


我将此标记为答案,因为它为我指明了正确的方向,但我对行//必须在UI线程部分设置MyImage.Source感到困惑?我需要为该部分做什么?如果您尝试设置
MyImage.Source=img如果不使用Dispatcher,您将获得一个跨线程访问异常。因此,除了示例之外,您不需要做任何事情,只需不删除Dispatcher位。我已经更新了我的答案来澄清这一点。好吧,我仔细研究了一下,最终发现了这一点,但我现在的主要问题是,我的“MyImage”嵌套在我的网格深处,后面的代码无法找到它,只能找到它所在的列。您可以从加载的事件处理程序中设置和调用WebClient。因此,使用WebClient而不是hostingWindow等。你需要的镜像实例是发送者。所以在尝试了几个场景后,我无法让它工作。我无法从代码隐藏中找到MyImage。调用时出现了一个奇怪的错误,关于lambda表达式?
<Border x:Name="MyBorder" Width="100" Height="100" Background="Black">
        <ToolTipService.ToolTip>
            <Image x:Name="MyImage" />
        </ToolTipService.ToolTip>

</Border>