【问题标题】:Image in the interface is not updated after WritableBitmap has changedWritableBitmap 更改后界面中的图像未更新
【发布时间】:2016-11-03 13:15:38
【问题描述】:

我试图通过在每次移动鼠标指针时绘制圆圈来更新图像。 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);

这一切都开始起作用了,但那不是内存效率低下吗?我不是每次移动鼠标时都为每个新的WriteableBitmap 分配内存吗?正如我发现的那样,问题肯定出在 Image 组件上。为什么当我只更改它的源时它不会更新,但是当我将它的源更改为不同的对象时它会更新。 `

【问题讨论】:

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


    【解决方案1】:

    我应该调用 Image 的方法来强制它重绘吗?

    关闭。 WriteableBitmap 上有一个方法。

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

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

     this.Image.Source = Bitmap;
    

    与:

     Bitmap.Invalidate();
    

    为什么当我只更改它的源时它不会更新,但当我将它的源更改为不同的对象时它会更新。

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

    【讨论】:

    • 那么有没有像Win32的InvalidateRegion这样的东西?如果我想绘制 1 个像素,是否需要重新绘制整个图像?这似乎效率很低。
    • 为了更有效的即时模式渲染,请使用 Win2D 而不是 WriteableBitmap。 github.com/Microsoft/Win2D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多