3

マウスポインタを移動するたびに円を描いて画像を更新しようとしています。 pixelBufferはmapオブジェクトに格納され、CircleFilledWithGradientMethod()で更新されます。ピクセルバッファをWriteableBitmap Bitmapに読み込んだ後、XAML UIのイメージ要素のイメージソースをビットマップに設定して表示しようとします。私が最初にマウスを動かすと、最初の2つの円が描かれていますが、マウスを動かすと画像は更新されません。なぜそれができますか? Imageを呼び出して強制的に再描画する方法がありますか?私がstream.WriteAsyncを2回使用した理由は、ちょうどそれを使用したときに、正しく動作していることを示すことです。私は何が起こっていると思う何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

強制的に再描画する必要がある方法はありますか?

閉じる。 WriteableBitmapにはメソッドがあります。

WriteableBitmap.Invalidateを更新してからリフレッシュを要求してください。

ビットマップがすでにImage.Sourceとした、ライン交換すると仮定すると:私はちょうどそのに変更を加える際に、なぜそれが更新されないだろう

Bitmap.Invalidate(); 

:で

this.Image.Source = Bitmap; 

をソースを変更しますが、ソースを別のオブジェクトに変更すると更新されます。

Image.Sourceを既に設定されているものと同じに設定するのはいいえです。最も複雑なプロパティは、既存の値を変更しない「変更」を無視します。新しいWriteableBitmapを作成するたびに、それは異なるので非常に非効率的に機能します。

+0

したがって、Win32のInvalidateRegionのようなものは何もありませんか? 1ピクセルを描画する場合は、イメージ全体を再描画する必要がありますか?それはかなり非効率的に思える。 –

+1

より効率的な即時モードレンダリングを行うには、WriteableBitmapではなくWin2Dを使用します。 https://github.com/Microsoft/Win2D –

関連する問題