Csharp/C#教程:WritableBitmap更改后,界面中的图像不会更新分享


WritableBitmap更改后,界面中的图像不会更新

我试图通过每次移动鼠标指针时绘制圆圈来更新图像。 pixelBuffer存储在map对象中,并使用CircleFilledWithGradientMethod()更新。 我将像素缓冲区加载到WriteableBitmap Bitmap ,然后尝试通过将我的XAML UI中的图像元素的图像源设置为WriteableBitmap Bitmap来显示它。 会发生什么,当我第一次移动鼠标时,我看到前两个圆圈被绘制,但是当我移动鼠标时,图像不会更新。 为什么会这样? 有没有一种方法我应该调用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; } 

我认为正在发生的是,只要我在屏幕上绘制图像,它就会缓存它,然后继续使用旧图像。 或者标准的Image元素不支持重绘?

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

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

这一切都开始奏效,但这种记忆效率不高吗? 每次移动鼠标时,我不是为每个新的WriteableBitmap分配内存。 正如我所知,问题肯定与Image组件有关。 当我只更改它的源时,为什么不更新它,但是当我将源更改为其他对象时更新。 `

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

关。 WriteableBitmap上有一个方法。

更新后请调用WriteableBitmap.Invalidate以请求刷新。

假设Bitmap已经设置为Image.Source,请替换该行:

  this.Image.Source = Bitmap; 

附:

  Bitmap.Invalidate(); 

当我只更改其源时,为什么不更新它,但是当我将源更改为其他对象时更新。

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

上述就是C#学习教程:WritableBitmap更改后,界面中的图像不会更新分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/949669.html

(0)
上一篇 2021年11月17日
下一篇 2021年11月17日

精彩推荐