我有一个Silverlight 5应用程序,它使用ImageTools for Silverlight将Canvas
保存到PNG图像。我知道我需要在UI线程上使用Canvas
并使用以下代码,这些代码有效:
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代码是异步运行的,所以我怎么知道它何时完成?
答案 0 :(得分:1)
如果你需要在UI Thread上调用ToImage()很好,但这并不意味着你必须对图像进行编码。
这样的事情将确保用户界面保持响应。
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);
});
});
}
}