C# 可写位图更改后,界面中的图像不会更新

C# 可写位图更改后,界面中的图像不会更新,c#,uwp,win-universal-app,windows-10-universal,writablebitmap,C#,Uwp,Win Universal App,Windows 10 Universal,Writablebitmap,我试图通过每次移动鼠标指针时画圆圈来更新图像。像素缓冲区存储在map对象中,并使用CircleFilleWithGradientMethod()更新。我将像素缓冲区加载到WriteableBitmap位图,然后通过将XAML UI中图像元素的图像源设置为位图来尝试显示它。发生的情况是,当我第一次移动鼠标时,我看到前两个圆圈被画出来,但当我移动鼠标时,图像没有得到更新。为什么会这样?是否有一种方法我应该调用Image来强制它重画?我之所以使用stream.WriteAsync两次,而我本可以只使用

我试图通过每次移动鼠标指针时画圆圈来更新图像。像素缓冲区存储在
map
对象中,并使用
CircleFilleWithGradientMethod()更新。我将像素缓冲区加载到
WriteableBitmap位图
,然后通过将XAML UI中图像元素的图像源设置为位图来尝试显示它。发生的情况是,当我第一次移动鼠标时,我看到前两个圆圈被画出来,但当我移动鼠标时,图像没有得到更新。为什么会这样?是否有一种方法我应该调用
Image
来强制它重画?我之所以使用stream.WriteAsync两次,而我本可以只使用一次,只是为了表明它工作正常

  private async void TextArea_PointerMoved(object sender, PointerRoutedEventArgs e)
            {
                Pixel pixel1 = new Pixel(255, 0, 0);
                Pixel pixel2 = new Pixel(255, 255, 255);

                map.CircleFilledWithGradient((int) pointer.Position.X, (int)pointer.Position.Y, 100, pixel1, pixel2);

                using (Stream stream = Bitmap.PixelBuffer.AsStream())
                {
                    stream.WriteAsync(map.pixelData, 0, map.pixelData.Length);
                }
                map.CircleFilledWithGradient((int)pointer.Position.X+100, (int)pointer.Position.Y, 100, pixel1, pixel2);

                using (Stream stream = Bitmap.PixelBuffer.AsStream())
                {
                    stream.WriteAsync(map.pixelData, 0, map.pixelData.Length);
                }
                this.Image.Source = Bitmap;
            }
我认为正在发生的是,只要我在屏幕上绘制图像,它就会缓存它,然后继续使用旧图像。还是标准图像元素不支持重绘

更新: 我的
Bitmap
是一个私有类变量。如果我这样做

WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight);
这一切都开始起作用了,但这不是内存效率低下吗?每次移动鼠标时,我不是都在为每个新的
WriteableBitmap
分配内存吗。正如我发现的,这个问题肯定与图像组件有关。为什么当我只是更改它的源时它不会更新,但当我将它的源更改为其他对象时它会更新。 `

是否有一种方法我应该调用图像来强制它重画

接近。WriteableBitmap上有一个方法

更新后调用以请求刷新

假设位图已设置为Image.Source,请替换该行:

 this.Image.Source = Bitmap;
与:

为什么当我只更改其源时它不会更新,而当我将其源更改为其他对象时它会更新


将Image.Source设置为与已设置的相同的对象是noop。大多数复杂的属性都会忽略不更改现有值的“更改”。每次创建一个新的WriteableBitmap都会起作用(效率很低),因为它不同。

所以没有什么比Win32的InvalidateRegion更好的了?如果我想画1个像素,我需要重画整个图像吗?这似乎效率很低。要获得更高效的即时模式渲染,请使用Win2D而不是WriteableBitmap。
 Bitmap.Invalidate();