WPF で Application.DoEvents() の動作をシミュレートします
WPF 開発では、イベントを処理する前にインターフェイスを更新し、非同期タスクを実行する必要がある場合があります。 WinForms の Application.DoEvents()
メソッドはこの機能を実現できますが、.NET 4 以降では、WPF にはこのメソッドがありません。
Application.DoEvents()
の役割: 現在の操作を一時停止し、システム イベント (マウスの移動、キーの押下など) を処理するために制御をメッセージ ポンプに渡し、その後制御をアプリケーションに返します。これにより、アプリケーションはイベントを処理する前にインターフェイスを更新し、他のバックグラウンド タスクを実行できるようになります。
WPF の代替: Dispatcher.Invoke()
WPF は Dispatcher.Invoke()
メソッドを使用して同様の機能を実現します。このメソッドを使用すると、デリゲートを Dispatcher
に渡し、UI スレッド上で非同期的に実行できます。
Dispatcher.Invoke()
を使用して Application.DoEvents()
をシミュレートします:
次のコードは、DoEvents()
メソッドをカスタマイズする方法を示しています。
<code class="language-csharp">public static void DoEvents() { Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); }</code>
使用法:
イベントの処理や非同期操作の実行前など、インターフェイスを更新するか、非同期タスクを実行する必要がある場合に、このメソッドを呼び出します。これにより、受信イベントの処理を継続しながら、WPF インターフェイスが確実に更新されます。たとえば、サンプル コードでは、
メソッドで myButton_Click()
を呼び出すと、不正確な座標の問題を解決できます。
DoEvents()
<code class="language-csharp">private void myButton_Click(object sender, RoutedEventArgs e) { DoEvents(); // 添加此行 Console.WriteLine("scale {0}, location: {1}", myScaleTransform.ScaleX, myCanvas.PointToScreen(GetMyByttonLocation())); myScaleTransform.ScaleX = myScaleTransform.ScaleY = myScaleTransform.ScaleX + 1; Console.WriteLine("scale {0}, location: {1}", myScaleTransform.ScaleX, myCanvas.PointToScreen(GetMyByttonLocation())); }</code>
を呼び出すことで、インターフェイスが更新されて正しい座標値が取得されるようにします。 これにより、非同期操作によるインターフェイス更新の遅延による座標計算エラーが回避されます。 Click
以上がWPF で Application.DoEvents() に相当するものは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。