3

Я пытаюсь обновить изображение путем рисования кругов при каждом перемещении указателя мыши. 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. Почему бы не обновить его, когда я просто вношу изменения в его источник, но обновляю, когда я меняю его источник на другой объект. `

ответ

1

Есть ли способ вызвать изображение, чтобы заставить его перерисовать?

Закрыть. Существует метод WriteableBitmap.

Позвоните по номеру WriteableBitmap.Invalidate после того, как вы обновите его, чтобы запросить обновление.

Предполагая Bitmap уже был установлен как Image.Source, замените строку:

this.Image.Source = Bitmap; 

С:

Bitmap.Invalidate(); 

Почему бы это обновить, когда я просто внести изменения в его source, но обновляется, когда я меняю свой источник на другой объект.

Настройка изображения. Источник на то же самое, что уже установлен, является noop. Самые сложные свойства игнорируют «изменения», которые не изменяют существующее значение. Создание нового WriteableBitmap каждый раз работает (очень неэффективно), потому что оно другое.

+0

Итак, нет ничего похожего на InvalidateRegion of Win32? Если я хочу нарисовать 1 пиксель, мне нужно перерисовать весь образ? Это кажется довольно неэффективным. –

+1

Для более эффективного немедленного отображения режима используйте Win2D вместо WriteableBitmap. https://github.com/Microsoft/Win2D –