UWP:如何防止在启动画面上加载数据

时间:2018-03-22 16:10:48

标签: c# uwp

在我的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();
        }

    }

1 个答案:

答案 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属性。