2015-10-20 65 views
3

我想在应用程序启动后立即将contentDialog显示为登录屏幕。只有当用户通过身份验证时,我才会显示其余的页面,否则不会出现。Win 10上的ContentDialog.showAsync通用窗口应用程序

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

在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?所有的 enter image description here enter image description here

回答

2

首先,你只是想显示弹出当用户在该网页上,这样的代码构造移动到OnNavigatedTo方法。当用户界面还没有准备好时,确实会出现错误,所以简单的攻击是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(); 
} 

额外注:你应该NOT use async void您ShowPopup方法,这应该只用于事件处理器。我真的鼓励你去阅读异步/等待,以防止'怪异'的错误。所以你的代码归结为:

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

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

我刚刚执行了上述所有代码。但我仍然得到相同的错误。 :( – sagar

+0

我将延迟从1增加到100.现在它可以工作了,非常感谢!! – sagar

+2

更好地使用页面的OnLoaded事件处理程序来绝对确保XAML已加载并且loginDialog存在。仍然没有足够的时间在一些设备上,所以要准备好崩溃...... – sibbl

相关问题