1

我在 UWP 应用程序中有一个导航视图模式,其中“导航根”页面托管子页面的框架。ContentDialog如果我从子页面调用 a ,如果我使用键盘快捷键,我仍然可以访问母版页中的对象。如果打开另一个内容对话框,这很容易导致应用程序崩溃。

我怎样才能使ContentDialog真正的模态?

可以在此处找到演示该问题的项目: https ://github.com/under3415/NavigationApp

简而言之,创建两个页面,一个在框架中托管另一个

<Frame Grid.Row="1" x:Name="RootContentFrame"/>

在母版页中,定义了一个Button或另一个对象AccessKey。在子页面中,调用ContentDialog. 当内容对话框打开时,按下ALT键,然后按下访问键。即使模式对话框打开,后面的对象也会触发。

4

1 回答 1

1

在母版页中,有一个 Button 或另一个定义了 AccessKey 的对象。在子页面中,调用 ContentDialog。打开内容对话框时,按 ALT 键,然后按访问键。即使模式对话框打开,后面的对象也会触发。

显示时ContentDialog,它将阻止与应用程序窗口的交互,直到被显式关闭。但它不能阻止访问键,因为键盘快捷键通过为用户提供一种直观的方式来通过键盘而不是指针设备(例如如触摸或鼠标)。

对于您的场景,我们建议制作事件来检测对话框是否显示,然后将根页面设置为IsEnable真或假。

在您的应用程序类中执行操作

public static Action<bool> IsDialogOpen;

检测对话框打开或关闭。

private async void Button_Click(object sender, RoutedEventArgs e)
{

    ContentDialog dialog = new ContentDialog
    {
        Content = "Press ALT, then C or V",
        Title = "Non Modal Dialog",
        PrimaryButtonText = "OK"
    };

    dialog.Opened += Dialog_Opened;
    dialog.Closed += Dialog_Closed;
    _ = await dialog.ShowAsync();


}

private void Dialog_Closed(ContentDialog sender, ContentDialogClosedEventArgs args)
{

    App.IsDialogOpen(false);
}

private void Dialog_Opened(ContentDialog sender, ContentDialogOpenedEventArgs args)
{

    App.IsDialogOpen(true);
}

禁用或启用根页面基础对话框是否打开。

public NavigationRoot()
{
    this.InitializeComponent();
    App.IsDialogOpen = (s) =>
    {
        this.IsEnabled = s ? false : true;
  
    };
}
于 2021-03-23T03:42:39.607 回答