マウスポインタを移動するたびに円を描いて画像を更新しようとしています。 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コンポーネントにあります。ソースを変更するだけでは更新されませんが、ソースを別のオブジェクトに変更すると更新されるのはなぜですか? `
したがって、Win32のInvalidateRegionのようなものは何もありませんか? 1ピクセルを描画する場合は、イメージ全体を再描画する必要がありますか?それはかなり非効率的に思える。 –
より効率的な即時モードレンダリングを行うには、WriteableBitmapではなくWin2Dを使用します。 https://github.com/Microsoft/Win2D –