1. ホーム
  2. c#

[解決済み] WPFのApplication.DoEvents()はどこにあるのか?

2023-03-02 13:43:32

質問

以下のような、ボタンが押されるたびにズームするサンプルコードを持っています。

XAMLです。

<Window x:Class="WpfApplication12.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Canvas x:Name="myCanvas">

        <Canvas.LayoutTransform>
            <ScaleTransform x:Name="myScaleTransform" />
        </Canvas.LayoutTransform> 

        <Button Content="Button" 
                Name="myButton" 
                Canvas.Left="50" 
                Canvas.Top="50" 
                Click="myButton_Click" />
    </Canvas>
</Window>

*.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        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()));
    }
    
    private Point GetMyByttonLocation()
    {
        return new Point(
            Canvas.GetLeft(myButton),
            Canvas.GetTop(myButton));
    }
}

が出力されます。

scale 1, location: 296;315
scale 2, location: 296;315

scale 2, location: 346;365
scale 3, location: 346;365

scale 3, location: 396;415
scale 4, location: 396;415

を使うことで解決できると思います。 Application.DoEvents(); を使えば解決すると思ったのですが...そこには a priori は.NET 4では存在しません。

どうすればいいのでしょうか?

どのように解決するのですか?

WPF では、古い Application.DoEvents() メソッドは非推奨とされ、代わりに ディスパッチャ または バックグラウンド・ワーカ・スレッド を使用して、説明したような処理を行うことができます。両方のオブジェクトを使用する方法については、リンク先の記事を参照してください。

どうしても Application.DoEvents() を使用しなければならない場合、単純に system.windows.forms.dll をアプリケーションにインポートして、そのメソッドを呼び出すことができます。しかし、WPF が提供するすべての利点を失うことになるため、これは本当にお勧めできません。