0

この質問は、これからのフォローアップです。datagridのツールチップからのsilverlight4画像プレビュー

これは私の新しい問題です。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ページがすでに呼び出されていて、コールバックできないためですか?ツールチップ内に画像を取り込むための実行可能なソリューションはありますか?または、ツールチップを保持するSilverlightコントロールにrepsonse.redirectする方法はありますか?

4

1 に答える 1

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>
于 2012-07-31T20:04:54.963 に答える