ホームページ > バックエンド開発 > C++ > WPF で Application.DoEvents() 機能を実現するにはどうすればよいですか?

WPF で Application.DoEvents() 機能を実現するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-13 11:10:43
オリジナル
823 人が閲覧しました

How to Achieve the Application.DoEvents() Functionality in WPF?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート