WinUIでContentDialogを出す
2 min
262 words
Suzuki Shun
Categories: posts
Tags: C# WinUI ContentDialog
WinUIでContentDialog
を出そうとしたらハマったのでメモを残しておく.
ドキュメントをよく読むと分かるのだが, XamlRoot
を設定しないとだめらしい.
Viewのコードに書く場合は
var dialog = new ContentDialog
{
...
XamlRoot = Content.XamlRoot,
};
のように, Content.XamlRoot
で取得できるらしいが, ViewModelに書きたい.
そこで, 最初はView側のコンストラクタでContent.XamlRoot
を取得しViewModelに設定しようとしたが, この場合はContent.XamlRoot
がnull
になってしまいだめだった.
調べると, 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!, }; ... }