3

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

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; 
      } 

我认为正在发生的是,当我在屏幕上绘制图像,它缓存,然后使用旧图像保持。还是说标准的Image元素不支持重绘?我的Bitmap是一个私人类变量。如果我这样做

WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight); 

这一切都开始工作,但不是内存效率低下?我每次移动鼠标时都不会为每个新的WriteableBitmap分配内存。正如我发现的那样,这个问题肯定与Image组件有关。为什么不更新它,当我更改它的源代码时更新,但是当我更改它的源代码到另一个对象时更新。 `

回答

1

是否有一种方法,我应该调用Image来强制它重绘?

关闭。 WriteableBitmap上有一个方法。

更新后请求更新请致电WriteableBitmap.Invalidate

假设位图已经被设置为Image.Source,更换线路:

this.Image.Source = Bitmap; 

有了:

Bitmap.Invalidate(); 

为什么不更新它,当我刚刚更改其来源,但更新时,我更改其来源到不同的对象。

将Image.Source设置为它已经设置为相同的事物是noop。大多数复杂的属性忽略不改变现有值的“变化”。每次创建一个新的WriteableBitmap(非常低效),因为它不同。

+0

所以没有什么像Win32的InvalidateRegion?如果我想绘制1个像素,是否需要重新绘制整个图像?这似乎相当低效。 –

+1

要获得更高效的即时模式渲染,请使用Win2D而不是WriteableBitmap。 https://github.com/Microsoft/Win2D –

相关问题