Я пытаюсь обновить изображение путем рисования кругов при каждом перемещении указателя мыши. PixelBuffer хранится в объекте map
и обновляется с помощью CircleFilledWithGradientMethod()
. Я загружаю буфер пикселей в WriteableBitmap Bitmap
, а затем попытаюсь отобразить его, установив источник изображения элемента изображения в свой XAML-интерфейс для растрового изображения. Что происходит, так это то, что когда я впервые двигаю мышью, я вижу первые два круга, а затем, когда я перемещаю мышь, изображение не обновляется. Почему это может быть? Есть ли способ, которым я должен позвонить Image
, чтобы заставить его перерисовать? Причина, по которой я использую stream.WriteAsync
два раза, когда я мог бы просто использовать его один, просто показать, что он работает правильно.Изображение в интерфейсе не обновляется после изменения WritableBitmap
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;
}
То, что я думаю, что происходит, является то, что как только я рисую изображение на экране, он кэширует его, а затем продолжает использовать старый образ. Или, что стандартный элемент изображения не поддерживает перерисовку?
Обновление: Моя Bitmap
была приватной переменной класса. Если я сделаю
WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight);
Все начинает работать, но разве эта память неэффективна? Разве я не выделяю память для каждого нового WriteableBitmap
каждый раз, когда я перемещаю мышь. И, как я выяснил, проблема, безусловно, связана с компонентом Image. Почему бы не обновить его, когда я просто вношу изменения в его источник, но обновляю, когда я меняю его источник на другой объект. `
Итак, нет ничего похожего на InvalidateRegion of Win32? Если я хочу нарисовать 1 пиксель, мне нужно перерисовать весь образ? Это кажется довольно неэффективным. –
Для более эффективного немедленного отображения режима используйте Win2D вместо WriteableBitmap. https://github.com/Microsoft/Win2D –