3

每次移动鼠标指针时,我都会尝试通过绘制圆圈来更新图像。pixelBuffer 存储在mapobject 中并使用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 组件上。为什么当我只更改它的源时它不会更新,但是当我将它的源更改为不同的对象时它会更新。`

4

1 回答 1

1

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

关。WriteableBitmap 上有一个方法。

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

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

 this.Image.Source = Bitmap;

和:

 Bitmap.Invalidate();

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

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

于 2016-11-03T17:01:04.760 回答