ContentDialog.showAsync 在 Win 10 通用 window 应用上

ContentDialog.showAsync on Win 10 Universal window app

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

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

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

但是我遇到了这个异常 "Value does not fall within the expected range." (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>

这不可能吗? ContentDialog 只能通过单击按钮触发吗?

首先,您只想在用户访问该页面时显示弹出窗口,因此将代码从构造函数移至 OnNavigatedTo 方法。当 UI 没有准备好时确实会抛出一个错误,所以一个简单的 hack 是 await Task.Delay(1); 给予优先权然后调用你的 ShowPopup 方法。

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

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

private async void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
    var result = await ShowPopup();
}

额外注意:您应该 NOT use async void 用于您的 ShowPopup 方法,因为它应该只用于事件处理程序。我真的鼓励您继续阅读 async/await 以防止 'weird' 错误。所以你的代码归结为:

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

private Task<ContentDialogResult> ShowPopup()
{
    return loginDialog.ShowAsync().AsTask();
}