UWP:加载页面时打开ProgressRing

UWP:加载页面时打开ProgressRing,uwp,progress-bar,Uwp,Progress Bar,在我的UWP应用程序的第一页,我在命令栏中有一个“添加”按钮,可以打开第二页 在第二个页面打开时,我从SQLite表加载了一个列表,并对该列表进行了筛选。这是一个相对较长的过程,因为有大量数据 当我单击第一页上的Add按钮时,它在加载列表的整个过程中保持高亮显示,第二页仅在列表加载到内存中时打开 我希望第二个页面在用户单击Add按钮后立即打开,并显示ProgressRing而不是ListView,这是运行数据加载的时间 我试着在第一页上写一个progressing: private void A

在我的UWP应用程序的第一页,我在命令栏中有一个“添加”按钮,可以打开第二页

在第二个页面打开时,我从SQLite表加载了一个列表,并对该列表进行了筛选。这是一个相对较长的过程,因为有大量数据

当我单击第一页上的Add按钮时,它在加载列表的整个过程中保持高亮显示,第二页仅在列表加载到内存中时打开

我希望第二个页面在用户单击Add按钮后立即打开,并显示ProgressRing而不是ListView,这是运行数据加载的时间

我试着在第一页上写一个progressing:

private void AddFavori_Click(object sender, RoutedEventArgs e)
{
    MyProgressRing.Visibility = Visibility.Visible;
    Frame.Navigate(typeof(ChoixFavoris), currentListeAchat);
}
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;
    });
}
但是,没有显示任何内容。第二页也是一样的:

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;
}
怎么做?谢谢所有能帮助我的人

我希望第二个页面在用户单击Add按钮后立即打开,并显示ProgressRing而不是ListView,这是运行数据加载的时间。我试着在第一页上写一个progressing:

private void AddFavori_Click(object sender, RoutedEventArgs e)
{
    MyProgressRing.Visibility = Visibility.Visible;
    Frame.Navigate(typeof(ChoixFavoris), currentListeAchat);
}
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;
    });
}
最好将
majtableArticles()
方法设置为异步方法。将Progressing控件放在第二页会更好

如果您不知道如何创建异步方法,请参阅

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

//MainPage.xaml.cs
私有无效按钮\u单击(对象发送者,路由目标e)
{
框架导航(typeof(BlankPage1));
}

受保护的异步覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
基地。导航到(e);
progressring.IsActive=true;
progressring.Visibility=可见性.Visibility;
等待任务。延迟(10000);
progressring.IsActive=false;
progressring.Visibility=Visibility.Collapsed;
}
[于2018年8月1日更新]

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

private void Test()
{
while(true)
{
Debug.WriteLine(DateTime.Now);
}
}
专用异步任务TestAsync()
{
等待任务。运行(()=>{
while(true)
{
Debug.WriteLine(DateTime.Now);
}
});
}
//在BalnkPage1.xaml.cs上
受保护的异步重写无效OnNavigatedTo(NavigationEventArgs e)
{
基地。导航到(e);
progressring.IsActive=true;
progressring.Visibility=可见性.Visibility;
等待TestAsync();
progressring.IsActive=false;
progressring.Visibility=Visibility.Collapsed;
}

我在第一页添加了此代码:

private void AddFavori_Click(object sender, RoutedEventArgs e)
{
    MyProgressRing.Visibility = Visibility.Visible;
    Frame.Navigate(typeof(ChoixFavoris), currentListeAchat);
}
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;
    });
}

此外,在数据加载期间,我在第一页上有进度信息。

非常感谢您的回复。问题是数据加载(MajtableArticles()方法)不包含我可以用wait调用的API。所以我不知道如何使这个方法异步。我绕过了这个问题,在第一页添加了我在页面上找到的代码:这不是很好,但用户并不觉得程序崩溃了。无论如何,谢谢。@MarcelDelhaye为什么你认为你不能创建一个异步方法?只是因为你没有一个等待的方法?那是不对的。请看我的最新回复。我制作了一个示例来演示如何简单地将同步方法转换为异步方法。当我运行程序时,它会在我的方法的一行上崩溃:rendered async:Message=应用程序调用了一个为不同线程维护的接口。我该怎么办?无论如何,非常感谢您的建议。@MarcelDelhaye这句话是否触及了应用程序的用户界面?如果是这样,您需要使用。