Win 10 通用窗口应用程序上的 ContentDialog.showAsync

sag*_*gar 5 c# xaml win-universal-app uwp

我想在应用程序启动后立即将 contentDialog 显示为登录屏幕。仅当用户通过身份验证时,我才想显示其余页面,否则不会出现任何内容。

我不希望用户单击任何按钮来加载此内容对话框,它应该在应用程序启动后立即出现。

在 MainPage 构造函数中,我调用了显示对话框的方法。

但我收到此异常“值不在预期范围内”。(System.ArgumentException) 并且应用程序在此之后不会加载。

这是来自我的 MainPage.xaml

 <ContentDialog x:Name="loginDialog"
                    VerticalAlignment="Stretch"
                    Title="Login"
                    PrimaryButtonText="Login"
                    SecondaryButtonText="Cancel">
                    <StackPanel>
                        <StackPanel>
                            <TextBlock Text="Username" />
                            <TextBox x:Name="Username" ></TextBox>
                        </StackPanel>
                        <StackPanel>
                            <TextBlock Text="Password" />
                            <TextBox x:Name="Password" ></TextBox>
                        </StackPanel>
                    </StackPanel>
                </ContentDialog>
Run Code Online (Sandbox Code Playgroud)

这不可能吗?ContentDialog 只能通过单击按钮来触发吗? 在此处输入图片说明 在此处输入图片说明

Bar*_*art 4

首先,您只想在用户位于该页面时显示弹出窗口,因此将代码从构造函数移至该OnNavigatedTo方法。当 UI 未准备好时,确实会引发错误,因此一个简单的技巧是await Task.Delay(1);给予优先级,然后调用 ShowPopup 方法。

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    await Task.Delay(1);
    var result = await loginDialog.ShowAsync();
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如 @sibbl 提到的,如果您使用代码隐藏,则使用页面 Loaded 事件更为明智。我选择了 OnNavigedTo,因为我总是使用Prism for MVVM,而在 ViewModel 中,它是您需要实现的 OnNavieratedTo 方法。

private async void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
    var result = await ShowPopup();
}
Run Code Online (Sandbox Code Playgroud)

额外注意:您不应该在 ShowPopup 方法中使用 async void,因为这只能用于事件处理程序。我真的鼓励您去阅读 async/await 以防止“奇怪”的错误。所以你的代码归结为:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    await Task.Delay(1);
    var result = await ShowPopup();
}

private Task<ContentDialogResult> ShowPopup()
{
    return loginDialog.ShowAsync().AsTask();
}
Run Code Online (Sandbox Code Playgroud)

  • 最好使用页面的“OnLoaded”事件处理程序来绝对确保 XAML 已加载并且登录对话框在那里。在某些设备上 100 毫秒仍然不够,所以要做好崩溃的准备…… (2认同)