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!");

这个电话"唤醒"了系统。再说一遍,有什么想法吗?

WPF窗口图像从菜单项更新,但在while循环中不更新

当您在处理中插入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的线程上与指定的参数异步执行指定的委托。"