2012-07-31 84 views
0

这个问题是来自这个问题的后续。 silverlight 4 image preview from tooltip on datagrid工具提示中显示的Silverlight数据绑定图像

这是我的新问题,我一直在试图获得一个工具提示,以弹出我的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"); 
    } 

这是设置去负责处理此操作我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转换为持有tooltip的silverlight控件?

回答

1

如果你的目的是要显示工具提示内的图像(而不是HTML窗口),下面的工作:

首先,Web服务(ASHX)

public class MyHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     String fileName = @"c:\PathToMyFile\Myfile.jpg"; 
     using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
     { 
      var buffer = new byte[fileStream.Length]; 
      fileStream.Read(buffer, 0, Convert.ToInt32(fileStream.Length)); 
      context.Response.ContentType = "image/jpeg"; 
      context.Response.BinaryWrite(buffer); 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

然后调用从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> 
+0

我将此标记为答案,因为它将我设置在正确的方向,但我对该行感到困惑//必须在UI线程部分设置MyImage.Source?我需要为那部分做些什么? – jcc 2012-08-01 15:23:15

+0

如果您尝试在不使用Dispatcher的情况下设置“MyImage.Source = img;”,则会得到一个跨线程访问异常。所以你不需要做比样本更多的事情,只是不要删除Dispatcher位。我已经更新了我的答案,以澄清这一点。 – 2012-08-01 17:22:05

+0

好吧,我玩了这个,最终发现了,但我现在的主要问题是,我的'MyImage'嵌套在我的网格深处,代码隐藏无法找到它,只能找到它的列in。 – jcc 2012-08-01 17:28:56