WPF窗口图像从菜单项更新,但在while循环中不更新
本文关键字:更新 while 循环 但在 图像 菜单项 WPF 窗口 | 更新日期: 2023-09-27 18:23:44
好吧,这真是一个令人头疼的问题:
如果我选择了一个菜单项,该菜单项使构成整个窗口(可写位图)的图像上绘制了一些像素,它就会这样做并正确显示。
但是,如果我在相同的方法中添加while循环(比如说5个循环),则位图上的图形不会显示,直到循环完成,然后正确显示第5个重新绘制的位图。
那么,当一个菜单项被选中但在while循环中被跳过时,窗口是否会发生某种"自动刷新"?
更多详细信息。这很好(带来一个"干净"的图像,在上面画一些东西,显示它):
// This brings in a 'clean' image
writeableBitmap = new WriteableBitmap(CleanVegMap);
image.Source = writeableBitmap;
// This makes a bunch of draws on the bitmap
DrawDinos2d();
然而,这会"消失"10秒,然后只显示最后一张(即第5张)图像:
int z = 0;
while (z < 5){
z++;
// This brings in a 'clean' image
writeableBitmap = new WriteableBitmap(CleanVegMap);
image.Source = writeableBitmap;
// This makes a bunch of draws on the bitmap
DrawDinos2d();
}
新想法:是否有可能是系统以某种方式将5个"绘制"的可写位图缓存在内存中?
尝试使用Dispatcher(如下所示):
Dispatcher.Invoke((Action)delegate
{
writeableBitmap = new WriteableBitmap(CleanVegMap);
image.Source = writeableBitmap;
DrawDinos2d();
});
同样的东西(消失10秒,然后只显示最后一张图像。
另一条线索是:我只是在每个循环底部的循环中放了一个MessageBox,正如我所怀疑的那样,它正确地"闪电式"刷新了屏幕。不知怎么的:
System.Windows.MessageBox.Show("Glarp!");
这个电话"唤醒"了系统。再说一遍,有什么想法吗?
当您在处理中插入MessageBox并得到预期结果时,UI线程有机会在MessageBox打开时被"捕获"。因此,它产生了一种"幻觉",即使用MessageBox突然使其工作,但在幕后,它只是线程自己进行排序并清除指令队列。
要以编程方式创建相同的效果,您可以使用以下方法更新位图(ETA:需要.NET 4.5 Framework)。。。
public void UpdateBitmap()
{
WriteableBitmap writeableBitmap = new WriteableBitmap
(100, 100, 96, 96, PixelFormats.Bgr32, null);
writeableBitmap.Dispatcher.InvokeAsync(() =>
{
Console.WriteLine("work goes here");
});
}
这将在位图的调度程序所关联的线程上异步运行操作,并将给UI一个迎头赶上的机会。根据"DrawDinos2d"方法的有效负载,您MIGHT必须将处理迁移到后台线程,并将其逐个提供给UI线程。但首先要从这种方法开始。
ETA:在.NET 4.0框架中,上面的对应部分看起来是这样的。。。
public void UpdateBitmap()
{
object[] objs = new object[] {null};
WriteableBitmap writeableBitmap = new WriteableBitmap(
100, 100, 96, 96, PixelFormats.Bgr32, null);
writeableBitmap.Dispatcher.BeginInvoke((SendOrPostCallback)delegate
{
Console.WriteLine(@"work goes here");
}, objs);
}
文档读取"在创建System.Windows.Threading.Dispatcher的线程上与指定的参数异步执行指定的委托。"