UWP:加载页面时打开一个ProgressRing

时间:2018-07-30 16:11:20

标签: uwp progress-bar

在UWP应用的第一页上,我在CommandBar中有一个“添加”按钮,可打开第二页。

在第二页的开头,我从SQLite表中加载了一个列表,并过滤了该列表。这个过程比较长,因为有很多数据。

当我单击第一页上的“添加”按钮时,它在加载列表的整个过程中始终突出显示,而第二页仅在列表加载到内存中时打开。

我希望用户单击“添加”按钮后立即打开第二页,并显示一个ProgressRing而不是ListView(运行数据加载的时间)。

我试图在第一页上放置一个ProgressRing:

private void AddFavori_Click(object sender, RoutedEventArgs e)
{
    MyProgressRing.Visibility = Visibility.Visible;
    Frame.Navigate(typeof(ChoixFavoris), currentListeAchat);
}

但是,什么也不显示。在第二页上也是一样:

public ChoixFavoris()
{
    this.InitializeComponent();
    MyProgressRing.Visibility = Visibility.Visible;
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    currentListeAchat = e.Parameter as ListeAchats;
    textBlock.Text = currentListeAchat.NomListe;
    majtableArticles();
    //
    base.OnNavigatedTo(e);
    // Register for hardware and software back request from the system
    SystemNavigationManager systemNavigationManager = SystemNavigationManager.GetForCurrentView();
    systemNavigationManager.BackRequested += OnBackRequested;
    MyProgressRing.Visibility = Visibility.Collapsed;
}

该怎么做?谢谢任何能帮助我的人。

2 个答案:

答案 0 :(得分:0)

  

我希望在用户单击“添加”按钮后立即打开第二页,并显示一个ProgressRing而不是ListView,这是运行数据加载的时间。我试图在第一页上放置一个ProgressRing:

您最好将majtableArticles()方法作为异步方法。并且将ProgressRing控件放在第二页上会更好。

如果您不知道如何制作异步方法,请参见Asynchronous programming

我制作了一个简单的代码示例供您参考。我只是使用await Task.Delay(10000)模拟了您耗时的加载数据操作。

//MainPage.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(BlankPage1));
}
<!--BalnkPage1.xaml-->
<Grid>
    <ProgressRing x:Name="progressring" Height="100" Width="100" Visibility="Collapsed" IsActive="False"></ProgressRing>
</Grid>
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    progressring.IsActive = true;
    progressring.Visibility = Visibility.Visible;
    await Task.Delay(10000);
    progressring.IsActive = false;
    progressring.Visibility = Visibility.Collapsed;
}

[已于2018/8/1更新]

@Marcel Delhaye这只是一个有关如何将同步方法转换为异步方法的简单示例。

private void Test()
{
    while (true)
    {
        Debug.WriteLine(DateTime.Now);
    }
}
private async Task TestAsync()
{
    await Task.Run(() => {
        while (true)
        {
            Debug.WriteLine(DateTime.Now);
        }
    });
}
//on BalnkPage1.xaml.cs
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    progressring.IsActive = true;
    progressring.Visibility = Visibility.Visible;
    await TestAsync(); 
    progressring.IsActive = false;
    progressring.Visibility = Visibility.Collapsed;
}

答案 1 :(得分:0)

我在第一页中添加了以下代码:

private async void AddFavori_Click(object sender, RoutedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        MyProgressRing.IsActive = true;
    });
    await Task.Delay(1000);

    Frame.Navigate(typeof(ChoixFavoris), currentListeAchat);

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        MyProgressRing.IsActive = false;
    });
}

此外,在数据加载过程中,我在第一页上显示了ProgressRing。