Изображение в интерфейсе не обновляется после изменения WritableBitmap
Я пытаюсь обновить изображение, рисуя круги при каждом перемещении указателя мыши. PixelBuffer хранится в map
объект и обновляется с CircleFilledWithGradientMethod()
, Я загружаю пиксельный буфер в WriteableBitmap Bitmap
и затем попытайтесь отобразить его, установив источник изображения элемента изображения в моем пользовательском интерфейсе XAML в Bitmap. Что происходит, так это то, что когда я впервые двигаю мышь, я вижу первые 2 круга, но затем, когда я двигаю мышь, изображение не обновляется. Почему это может быть? Есть ли метод, который я должен вызвать 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. Почему он не обновляется, когда я просто изменяю его источник, а обновляется, когда я меняю его источник на другой объект.
`
1 ответ
Есть ли метод, который я должен вызвать Image, чтобы заставить его перерисовать?
Близко. На WriteableBitmap есть метод.
Вызовите WriteableBitmap.Invalidate после его обновления, чтобы запросить обновление.
Предполагая, что Bitmap уже был установлен как Image.Source, замените строку:
this.Image.Source = Bitmap;
С:
Bitmap.Invalidate();
Почему он не обновляется, когда я просто изменяю его источник, а обновляется, когда я меняю его источник на другой объект.
Установка Image.Source на то же, что он уже установлен, является noop. Самые сложные свойства игнорируют "изменения", которые не меняют существующее значение. Создание нового WriteableBitmap каждый раз работает (очень неэффективно), потому что оно отличается.