3

マウスポインタを動かすたびに円を描いて画像を更新しようとしています。pixelBuffer はmapobject に格納され、 で更新されますCircleFilledWithGradientMethod()。ピクセル バッファーを に読み込んでからWriteableBitmap Bitmap、XAML UI の画像要素の画像ソースをビットマップに設定して表示しようとしました。何が起こるかというと、最初にマウスを動かしたときに最初の 2 つの円が描かれているのに、マウスを動かしても画像が更新されないということです。それはなぜでしょうか?Image強制的に再描画するために呼び出す必要があるメソッドはありますか? 私が 2 回使用する理由はstream.WriteAsync、1 回だけ使用できた場合に、それが適切に機能していることを示すためです。

  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マウスを動かすたびに、新しいものごとにメモリを割り当てていませんか。そして、私が発見したように、問題は間違いなく画像コンポーネントにあります。ソースを変更しただけでは更新されず、ソースを別のオブジェクトに変更すると更新されないのはなぜですか。`

4

1 に答える 1

1

イメージを強制的に再描画するために呼び出す必要があるメソッドはありますか?

近い。WriteableBitmap にはメソッドがあります。

更新後にWriteableBitmap.Invalidateを呼び出して更新を要求します。

Bitmap が既に Image.Source として設定されていると仮定して、次の行を置き換えます。

 this.Image.Source = Bitmap;

と:

 Bitmap.Invalidate();

ソースを変更しただけでは更新されず、ソースを別のオブジェクトに変更すると更新されるのはなぜですか。

Image.Source を既に設定されているのと同じものに設定するのは面倒です。ほとんどの複雑なプロパティは、既存の値を変更しない「変更」を無視します。毎回新しい WriteableBitmap を作成することは (非常に非効率的に) 機能するため、異なるためです。

于 2016-11-03T17:01:04.760 に答える