在我的UWP应用程序中,我在程序启动后加载了一些数据。我想在此过程中显示进度响铃。但是,程序仅在已加载数据时从splasch屏幕移动。如何强制程序使用进度环加载页面然后加载数据?
代码:
private async void AutoLogin()
{
var parameter = new Login();
parameter.Host = _host;
parameter.Port = _port;
parameter.DBname = _DBname;
parameter.User = _user;
parameter.Password = _password;
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4}; SSL Mode=Prefer; Trust Server Certificate=true",
parameter.Host,
parameter.User,
parameter.DBname,
parameter.Port,
parameter.Password);
NpgsqlConnection conn = new NpgsqlConnection(connString);
try
{
conn.Open();
if(conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
await LoadPage(parameter);
}
}
catch (Exception ex)
{
AutoLoginRing.IsActive = false;
AutoLoginRing.Visibility = Visibility.Collapsed;
LoginStackPanel.Visibility = Visibility.Visible;
}
}
async Task LoadPage(Login parameter)
{
try
{
Frame.Navigate(typeof(MainPage), parameter);
}catch(Exception ex)
{
var dialog = new ContentDialog()
{
Title = "Critical Error!",
Content = "Could not load Areas page. Restart the app or contact with the Support",
CloseButtonText = "Ok"
};
ContentDialogResult result = await dialog.ShowAsync();
}
}
答案 0 :(得分:1)
两个页面的构造函数及其OnNavigatedTo
方法必须完成,因为它们都在UI线程上运行,因此启动画面会消失。这意味着您应该在之后或异步执行任何加载。
考虑以下示例:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
Thread.Sleep(5000);
ProgressBar.Visibility = Visibility.Collapsed;
}
正如您所料,这会导致启动画面持续五秒钟。而在这里:
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
await Task.Delay(5000);
ProgressBar.Visibility = Visibility.Collapsed;
}
该页面会尽快显示。这是因为await
基本上"结束" OnNavigatedTo
事件处理程序执行直到延迟结束,释放UI线程然后可以自由地完成导航,并且等待发生在另一个线程上。当然只是等待等待是没有用的,但我包含了示例,用于演示如何实现更快的导航 - 在第一个OnNavigatedTo
之前最小化页面构造函数和await
中的工作量。
您甚至可以使用await Task.Run( ... )
将逻辑移动到另一个线程,但是当您需要运行与UI相关的操作(如访问控制或修改数据绑定)时,您必须确保使用Dispatcher
属性。