3

我試圖在每次移動鼠標指針時都通過繪製圓圈來更新圖像。 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組件有關。爲什麼不更新它,當我更改它的源代碼時更新,但是當我更改它的源代碼到另一個對象時更新。 `

回答

1

是否有一種方法,我應該調用Image來強制它重繪?

關閉。 WriteableBitmap上有一個方法。

更新後請求更新請致電WriteableBitmap.Invalidate

假設位圖已經被設置爲Image.Source,更換線路:

this.Image.Source = Bitmap; 

有了:

Bitmap.Invalidate(); 

爲什麼不更新它,當我剛剛更改其來源,但更新時,我更改其來源到不同的對象。

將Image.Source設置爲它已經設置爲相同的事物是noop。大多數複雜的屬性忽略不改變現有值的「變化」。每次創建一個新的WriteableBitmap(非常低效),因爲它不同。

+0

所以沒有什麼像Win32的InvalidateRegion?如果我想繪製1個像素,是否需要重新繪製整個圖像?這似乎相當低效。 –

+1

要獲得更高效的即時模式渲染,請使用Win2D而不是WriteableBitmap。 https://github.com/Microsoft/Win2D –

相關問題