我試圖在每次移動鼠標指針時都通過繪製圓圈來更新圖像。 pixelBuffer存儲在map
對象中,並使用CircleFilledWithGradientMethod()
更新。我將像素緩衝區加載到WriteableBitmap Bitmap
,然後嘗試通過將我的XAML UI中圖像元素的圖像源設置爲位圖來顯示它。發生什麼事情是,當我第一次移動鼠標時,我看到前兩個畫出的圓圈,但隨着我移動鼠標,圖像不會被更新。爲什麼會這樣?有沒有一種方法可以調用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;
}
我認爲正在發生的是,當我在屏幕上繪製圖像,它緩存,然後使用舊圖像保持。還是說標準的Image元素不支持重繪?我的Bitmap
是一個私人類變量。如果我這樣做
WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight);
這一切都開始工作,但不是內存效率低下?我每次移動鼠標時都不會爲每個新的WriteableBitmap
分配內存。正如我發現的那樣,這個問題肯定與Image組件有關。爲什麼不更新它,當我更改它的源代碼時更新,但是當我更改它的源代碼到另一個對象時更新。 `
所以沒有什麼像Win32的InvalidateRegion?如果我想繪製1個像素,是否需要重新繪製整個圖像?這似乎相當低效。 –
要獲得更高效的即時模式渲染,請使用Win2D而不是WriteableBitmap。 https://github.com/Microsoft/Win2D –