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