WPF の Application.DoEvents() メソッドをモックする
従来の Windows フォーム アプリケーションでは、Application.DoEvents()
メソッドを使用して、アプリケーションが制御をオペレーティング システムに戻して他の UI イベントを処理できるようにします。ただし、WPF にはネイティブに同等の Application.DoEvents()
メソッドがありません。
この問題を解決するには、カスタム DoEvents()
メソッドを作成します。以下に例を示します:
<code class="language-csharp">public static void DoEvents() { Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); }</code>
このメソッドは、Dispatcher.Invoke()
メソッドを使用して、バックグラウンド スケジューラ スレッドで空のデリゲートを呼び出します。これにより、スケジューラは保留中のタスクを強制的に処理し、実質的に制御をオペレーティング システムに戻します。
次のコード例を考えてみましょう:
<code class="language-csharp">public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void myButton_Click(object sender, RoutedEventArgs e) { Console.WriteLine($"缩放比例:{myScaleTransform.ScaleX},位置:{myCanvas.PointToScreen(GetMyButtonLocation())}"); myScaleTransform.ScaleX = myScaleTransform.ScaleY = myScaleTransform.ScaleX + 1; DoEvents(); // 处理任何挂起的 UI 事件以更新按钮的位置 Console.WriteLine($"缩放比例:{myScaleTransform.ScaleX},位置:{myCanvas.PointToScreen(GetMyButtonLocation())}"); } private Point GetMyButtonLocation() { return new Point(Canvas.GetLeft(myButton), Canvas.GetTop(myButton)); } }</code>
スケール変換を更新した後に DoEvents()
を手動で呼び出すことにより、アプリケーションは次の Console.WriteLine()
呼び出しの前にボタンの位置が更新されるようにします。
以上がWPF で Application.DoEvents() 機能を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。