0

我有一个 Silverlight 5 应用程序,它使用ImageTools for Silverlight将 a 保存Canvas到 PNG 图像。我知道我需要Canvas在 UI 线程上使用并具有以下代码,该代码有效:

if (saveFileDialog.ShowDialog() == true)
{
    var stream = saveFileDialog.OpenFile();

    writeableBitmap.Dispatcher.BeginInvoke(delegate
    {
        ExtendedImage extendedImage = writeableBitmap.ToImage();

        new PngEncoder().Encode(extendedImage, stream);
    });
}

问题是,如果 Canvas 非常大,BeginInvoke完成中的代码可能需要相当长的时间。由于这是在 UI 线程上运行的,因此它会在执行期间冻结浏览器窗口。

在用户选择保存导出图像的位置后,我想弹出一些子窗口告诉用户“请稍候...”,然后运行上面发布的图像保存代码,然后隐藏子窗口窗口自动,但我没有太多的运气来做到这一点。

对于初学者来说,BeginInvoke 代码是异步运行的,那么我怎么知道它何时完成呢?

4

1 回答 1

1

如果您需要在 UI 线程上调用 ToImage() ,那很好,但这并不意味着您也必须对图像进行编码。

这样的事情将确保 UI 保持响应。

if (saveFileDialog.ShowDialog() == true)
{
    using (var stream = saveFileDialog.OpenFile())
    {
        writeableBitmap.Dispatcher.BeginInvoke(delegate
        {
            ExtendedImage extendedImage = writeableBitmap.ToImage();
            System.Threading.ThreadPool.QueueUserWorkItem(item =>
            {
                new PngEncoder().Encode(extendedImage, stream);
            });
        });
    }
}
于 2013-02-15T18:19:21.367 回答