应用程序运行时不显示ProgressRing

时间:2015-04-01 02:02:33

标签: c# xaml windows-phone-8.1

我正在开发适用于Windows 8.1和Windows Phone 8.1的“通用应用程序”

我需要在页面中添加ProgressRing控件,因为有一项任务需要一些时间才能完成,我应该通知用户该应用正在加载数据。所以我在以下链接中遵循MDSN上的说明:

To create an indeterminate progress ring 他们说出了我真正需要的东西:

  

4。添加不确定的进度环

     

当你无法估计完成一项任务所需的工作量时   任务会阻止用户交互,使用不确定的进度环。   不确定的进度环显示点的动画序列   移动一圈。

当我在启动任务的代码之前插入ProgressRing时,问题是prog.IsActive = true;不播放“加载”动画

如果我评论代码的任务行,它就会播放。

XAML:

 <ProgressRing x:Name="prog" Margin="435,349,388,181" FontFamily="{StaticResource FontFamily6}" FontSize="25" />

C#:

 private void LevelTap(object sender, TappedRoutedEventArgs e)
    {
        prog.IsActive = true;
        CheckNav(sender);
    }

private void CheckNav(object sender)
    {
        TextBlock tb = sender as TextBlock;
        GameSetter game = new GameSetter();
        game.Level = (int)TextDict[tb];
        if (!LevelsArr[game.Level]) return;
        if (!goToLeader)
        {            
            prog.IsActive = false;
            CallNav(true, game);
        }
        else
        {
            prog.IsActive = false;
            CallNav(false, game);
        }    
    }

    private void CallNav(bool b,GameSetter g)
    { 
        if(b)  Frame.Navigate(typeof(Game8), g);
        else Frame.Navigate(typeof(MainPage), g);
    }

注意:最后运行的任务使用DictionaryWindows.Storage.ApplicationDataNavigation作为另一页。

2 个答案:

答案 0 :(得分:2)

如果始终打开Progressing inDeterminate模式,您也可以在每个函数中使用此代码块:

  #region Progress Ring Start
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                Waiter.Visibility = Visibility.Visible; // Progress ring name is Waiter.
            });

            #endregion
            await Task.Delay(1000);
            CheckNav(sender); // Your process



            #region Progress Ring Finish
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                Waiter.Visibility = Visibility.Collapsed; // Progress ring name is Waiter.

            });
            #endregion

答案 1 :(得分:1)

代码中的缺陷(除了事实上它可能几乎是即时的,如注释@kennyzx),是你需要LevelTap方法来返回UI以进行更新。当方法返回时,您已经将ProgressRing.IsActive属性设置为false,这意味着根本不会显示任何内容。

解决这个问题的一个简单方法是使用异步Task.Yield方法为UI线程提供运行的机会:

private async void LevelTap(object sender, TappedRoutedEventArgs e)
{
    prog.IsActive = true;

    await Task.Yield();

    CheckNav(sender);
}

但是几乎没有任何内容会显示,因为你的代码不需要花很长时间才能执行。如果您真的想强制指示器显示0.5秒,您可以执行以下操作:

private async void LevelTap(object sender, TappedRoutedEventArgs e)
{
    prog.IsActive = true;

    await Task.Delay(500);

    CheckNav(sender);
}