【问题标题】:ContentDialog.showAsync on Win 10 Universal window appWin 10 通用窗口应用程序上的 ContentDialog.showAsync
【发布时间】:2015-10-20 06:57:33
【问题描述】:

我想在应用程序启动后立即将 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>

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

【问题讨论】:

    标签: c# xaml win-universal-app uwp


    【解决方案1】:

    首先,您只想在用户在该页面上时显示弹出窗口,因此将代码从构造函数移至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 提到的,如果您使用代码隐藏,使用页面加载事件会更明智。我选择了 OnNavigatedTo,因为我总是将 Prism 用于 MVVM,而在 ViewModel 中,它是您需要实现的 OnNavigatedTo 方法。

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

    额外注意:你应该为你的 ShowPopup 方法使用NOT use 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();
    }
    

    【讨论】:

    • 我刚刚执行了你上面说的所有代码。但我仍然得到同样的错误。 :(
    • 我将延迟从 1 增加到 100。现在它可以工作了。非常感谢!!
    • 最好使用页面的OnLoaded 事件处理程序来绝对确保已加载 XAML 并且 loginDialog 在那里。在某些设备上 100 毫秒仍然不够,所以要为崩溃做好准备......
    • 那里有一点(我忽略了那个,因为我使用了 MVVM),将其添加到回复中。保留 Task.Delay hack,因为它可能在其他场景中有用。
    猜你喜欢
    • 2016-11-05
    • 2016-06-20
    • 2016-11-11
    • 2015-10-26
    • 2018-07-17
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多