5

これにより UI が更新されると聞きましたが、なぜですか? Dispatcherこの空のアクションを呼び出しますInvalidateMeasure()。つまり、UI をトリガーしてアクション内で再測定、再配置、再レンダリングする呼び出しはありません。update/refreshUIへの測定と配置プロセスはどこにありますか?

private static Action EmptyDelegate = delegate() { };

public static void Refresh(UIElement uiElement)
{
   uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
}

何か助けはありますか?

EDITED:UIがレンダリングされる理由を詳しく知りたいです。次のような回答well that triggers ui updateは、これ以上私を助けてくれません。

4

2 に答える 2

3

Microsoft は、 PushFrameを使用してコードで行うこととは少し異なる方法をお勧めします。

コードはレンダリングとは関係ありません。それが行うことはDoEvents、VB6 および WinForms で知られている方法に似ています。 DoEventsWindows メッセージ キューをポンピングし、キュー内のメッセージを処理している間、プログラムを停止します。WM_PAINTこれには、やなどのレンダリング メッセージが含まれますWM_NCPAINT

このコードは、現在のスレッドを停止してそのキューをポンプし、DispatcherPriority.Render 以上の優先度を持つすべてのメッセージを処理するよう Dispatcher に指示します。保留中のレンダリング メッセージがキューにある場合 (たとえば、InvalidateRectがフレームワークによってどこかで呼び出された場合)、これらのメッセージが処理され、UI が再レンダリングされます。

DoEventsメッセージキューをバイパスするため、常にコードの臭いと見なされてきました。応答性の高いユーザー インターフェイスが必要な場合は、代わりにワーカー スレッドを使用する必要があります。

于 2013-03-07T10:33:40.380 に答える
1

これを使用して、呼び出しの優先度のために WPF に UI を強制的に更新させることができます。DispatcherPriority.Renderこの呼び出しは Dispatcher を同期的に使用するため、指定したデリゲートを実行する前に、同等以上の優先度で既にキューに入れられているタスクが実行されます。

DispatcherPriorityの可能な値のリストを次に示します。これは、タスクがディスパッチャーによって実行される順序を説明しています。

于 2013-03-06T15:29:21.797 に答える