--- lang: ja-jp breaks: true --- # WPF 処理状況ダイヤログを表示して重たい処理を Task で実行する。 2021-05-26 ![](https://i.imgur.com/gPYQVyd.png) ## ProgressDialog.xaml ```xml= <Window ・・・ xmlns:metro="http://metro.mahapps.com/winfx/xaml/controls" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" ・・・ /> <Grid Margin="0,0,0,10"> <metro:ProgressRing /> <Button Width="100" Style="{DynamicResource MaterialDesignRaisedButton}" materialDesign:ShadowAssist.ShadowDepth="Depth2" Content="キャンセル" VerticalAlignment="Bottom" Click="Button_Click" /> </Grid> </Window> ``` ## ProgressDialog.xaml.cs ```csharp= bool m_doCancel = false; public ProgressDialog() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { m_doCancel = true; } public bool DoCancel { get { return this.m_doCancel; } } ``` ## MainWindow.xaml ```xml= <metro:MetroWindow ・・・ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" ・・・ /> <Grid> <StackPanel Orientation="Vertical"> </StackPanel> <Button Width="300" Style="{DynamicResource MaterialDesignRaisedButton}" materialDesign:ShadowAssist.ShadowDepth="Depth2" Content="処理実行" Click="Button_Click" VerticalAlignment="Center" /> </Grid> </metro:MetroWindow> ``` ## MainWindow.xaml.cs ```csharp= private void Button_Click(object sender, RoutedEventArgs e) { ProgressDialog progress = new ProgressDialog(); progress.Owner = this; progress.WindowStartupLocation = WindowStartupLocation.CenterOwner; Task tsk = new Task(() => DoWork(progress)); tsk.Start(); progress.ShowDialog(); } private void DoWork(ProgressDialog progress) { // 重たい処理 while (progress.DoCancel == false) { Thread.Sleep(10); } progress.Dispatcher.Invoke(() => progress.Close()); } ``` ###### tags: `WPF` `ProgressRing` `MahApps.Metro.Controls` `MahApps.Metro`