おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

【WPF】ダイアログ表示を行う方法。

はじめに

WPFでダイアログ表示を行う方法を備忘録として残したいと思います。

前提

今回の記事はPrismを用いていることが前提となります。

ユーザーコントロール画面を新規作成

まずはポップアップで表示するユーザーコントロール画面を新規に追加します。
プロジェクトを右クリック > 追加 > ユーザーコントロールをクリックします。

Viewsフォルダに新規のページが出来ていることを確認した後、実際の画面を作成していきます。
今回は以下のようなXAMLを書いてみました。

<UserControl x:Class="ExtendSettingsView.Views.HelpPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"             
             prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <StackPanel Margin="10">
            <TextBlock Text="拡張HTML" Margin="10" FontSize="14"/>
            <TextBlock Margin="10,1,10,1" Text="拡張HTMLは各画面の特定箇所へHTMLを挿入するよ!エリア選択をして試してみてね!" />
            <TextBlock Text="拡張CSS" Margin="10" FontSize="14"/>
            <TextBlock Margin="10,1,10,1" Text="拡張CSSは任意のCSSを挿入できるよ!エリア選択はいらないよ!試してみてね!" />
        </StackPanel>
    </Grid>
</UserControl>

ダイアログ表示を行う処理をViewModel側へ記載

次にダイアログ表示を行う側の処理を書いていきます。
PrismのIDialogServiceを用いることで容易に実装が可能です。以下へ手順を記載します。

① 呼び出し側のコンストラクタへIDialogServiceを追加します。

public class MainWindowViewModel : BindableBase
{
    private IDialogService _dialogService;
    public MainWindowViewModel(IDialogService dialogService)
    {
        _dialogService = dialogService;
    }
}

②ダイアログ表示の処理を書きます。
以下のようにShowDialogメソッドでダイアログ対象のページ(以下だとHelpPageというページを表示)を指定し、任意のイベントで動作するようにします。

_dialogService.ShowDialog(nameof(HelpPage));

③App.xaml.csへDialogのDI処理を記載します。

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    // 以下を追加。ViewおよびViewModelは適宜変更してください。
    containerRegistry.RegisterDialog<HelpPage, HelpPageViewModel>();
}

④ダイアログ表示されるページのViewModelへIDialogAwareを継承するよう修正します。
※Title等必要なものを継承する必要があります。

public class HelpPageViewModel : BindableBase, IDialogAware
{
    public HelpPageViewModel()
    {

    }

    // 以下はIDialogAwareを継承することで必要な内容
    public string Title => throw new NotImplementedException();

    public event Action<IDialogResult> RequestClose;

    public bool CanCloseDialog() => true;

    public void OnDialogClosed()
    {
    }

    public void OnDialogOpened(IDialogParameters parameters)
    {
    }
}

上記のCanCloseDialogはダイアログを削除することができるかどうかを制御しています。

実際のダイアログ表示

上記の実装をすることで以下のようにダイアログ表示することができました!

おわりに

以上、WPFでダイアログ表示を行う方法でした!