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

时间:2016-11-03 13:15:39

标签: c# uwp win-universal-app windows-10-universal writablebitmap

我试图通过每次移动鼠标指针时绘制圆圈来更新图像。 pixelBuffer存储在map对象中,并使用CircleFilledWithGradientMethod()进行更新。我将像素缓冲区加载到WriteableBitmap Bitmap,然后尝试通过将我的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;
            }

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

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

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

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

1 个答案:

答案 0 :(得分:1)

  

我应该在Image上调用一个方法强制它重绘吗?

关闭。 WriteableBitmap上有一个方法。

更新后请致电WriteableBitmap.Invalidate以请求刷新。

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

 this.Image.Source = Bitmap;

使用:

 Bitmap.Invalidate();
  

为什么在我只更改其源时会更新,但在将源更改为其他对象时会更新。

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