我想在启动应用程序后立即将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>
答案 0 :(得分:4)
首先,您只想在用户在该页面上时显示弹出窗口,因此将代码从构造函数移动到OnNavigatedTo
方法。当UI未准备好时,确实会抛出一个错误,所以一个简单的黑客是await Task.Delay(1);
优先,然后调用你的ShowPopup方法。
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
await Task.Delay(1);
var result = await loginDialog.ShowAsync();
}
编辑:正如@sibbl所提到的,如果你使用代码隐藏,那么使用页面Loaded事件会更明智。我去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();
}