WinUIでContentDialogを出す

2 min 262 words
Suzuki Shun Placeholder text describing the default author's avatar.

WinUIでContentDialogを出そうとしたらハマったのでメモを残しておく.

ドキュメントをよく読むと分かるのだが, XamlRootを設定しないとだめらしい. Viewのコードに書く場合は

   var dialog = new ContentDialog
            {
                ...
                XamlRoot = Content.XamlRoot,
            };

のように, Content.XamlRootで取得できるらしいが, ViewModelに書きたい. そこで, 最初はView側のコンストラクタでContent.XamlRootを取得しViewModelに設定しようとしたが, この場合はContent.XamlRootnullになってしまいだめだった.

調べると, Loadedイベントでやればいいという情報を見つけたので以下のようにしたところ正しく動いた.

  • MyPage.xaml

    <Page
        ...
        Loaded="MyPage_OnLoaded"
        ...
        >
    
  • MyPage.xaml.cs

    public sealed partial class MyPage : Page
    {
        public MyViewModel ViewModel
        {
            get;
        }
    
        public MyPage()
        {
            ViewModel = App.GetService<MyViewModel>();
            InitializeComponent();
        }
    
        private void MyPage_OnLoaded(object sender, RoutedEventArgs e)
        {
            ViewModel.XamlRoot = Content.XamlRoot;
        }
    }
    
  • MyViewModel.cs

    public class MyViewModel : ObservableRecipient
    {
        public XamlRoot? XamlRoot
        {
            get;
            set;
        }
    
        public MyViewModel()
        {
            XamlRoot = null;
            
            ...
        }
    
        public void ShowDialog() {
            var dialog = new ContentDialog
                {
                    ...
                    XamlRoot = XamlRoot!,
                };
            ...
        }