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)
首先,您只想在用户位于该页面时显示弹出窗口,因此将代码从构造函数移至该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)