2

childをCanvas含む があるとしRectangleます。次に、ユーザーは、左上隅を上方向および左方向に引っ張って Rectangle のサイズを変更します (右下隅は固定したままにします)。

Rectangle の新しい位置とサイズは次のように設定されます (準コード):

Canvas.SetLeft(rectangle, newLeft);
Canvas.SetTop(rectangle, newTop);
rectangle.Width += oldLeft - newLeft;
rectangle.Height += oldTop - newTop;

WPF は、これらの配置/サイズの変更ごとに再描画を実行しますか (つまり、各プロパティの変更により、関連する要素が無効になり、それ自体で再描画がトリガーされます)、またはそれらは「キューに入れられ」(「ダーティとしてマーク」され)、一度に実行されます。 「次の再描画」で(いつでも)?

編集InvalidateArrange:Canvas.LeftとCanvas.Topの設定が、そのようなシナリオで複数の呼び出しが行われるCanvasため(たとえば、統合されたCanvas.SetTopLeftと比較して) 、冗長/非効率的なコードを個別に表す程度(ある場合)に興味がありますまたはCanvas.SetRectメソッド)。これは、 「InvalidateArrange または特に UpdateLayout を頻繁に呼び出すと、パフォーマンスに重大な影響を与える」という MSDN ドキュメントの警告が原因の1 つです。

4

1 に答える 1

1

一般に、基本的な WPF アプリケーションには 1 つのスレッドがあります。これは、一度に 1 つのことを実行できることを意味し、コードから命令を読み取っているときに UI をレンダリングできないことも意味します。そのため、コードからすべての命令を読み取り、プログラムの実行が現在のメソッドの最後に到達すると、レンダリング モードに入り、1 つのパスで UI をレンダリングします。

これが、プログラムの実行が、バックグラウンド スレッドを使用して実行されていない長時間実行されるタスクを処理しているときに UI が「ハング」する理由です (ここでコードについて話しているわけではありません)。現在のメソッドが終了し、プログラムの実行が UI に戻るまで、UI は応答しません。

于 2013-11-14T13:26:28.293 に答える