【问题标题】:ProgressRing is not showing while the app runs应用程序运行时 ProgressRing 未显示
【发布时间】:2015-04-01 02:02:32
【问题描述】:

我正在为 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作为另一个页面。

【问题讨论】:

  • 嗯,让我猜猜,GameSetter game = new GameSetter(); 需要很长时间,对吧?
  • @kennyzx 不完全是,构造函数实际上什么也没做,它只有 3 个属性。
  • 所以在您启动进度环后,您可以通过设置prog.IsActive = false; 立即停止它 - 因为似乎没有任何步骤是耗时的。
  • @kennyzx 我想出了一个主意,当ProgressRing 启动时实现一个计时器,0.5 秒后它会启动任务,这样就成功了,但是,这不是我喜欢的编码方式。
  • 好的,应该可以,至少 ProgressRing 会显示半秒。但首先检查代码的性能,使用Stopwatcher 计算每行花费的时间。如果游戏加载确实不慢,你就不需要这个ProgressRing

标签: c# xaml windows-phone-8.1


【解决方案1】:

如果 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

【讨论】:

    【解决方案2】:

    您的代码中的缺陷(除了它可能几乎是即时的,正如@kennyzx 所指出的那样)是您需要返回LevelTap 方法以更新UI。当方法返回时,您已经将ProgressRing.IsActive 属性设置回false,这意味着什么都不会显示。

    解决这个问题的一种简单方法是使用 async 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);
    }
    

    【讨论】:

    • 你们两个没明白我想说什么,0.5秒是应用程序等待启动任务的时间,所以需要0.5秒+任务时间=(大约 3 秒),我认为在这段时间内制作 ProgressRing 是合理的
    • @GabourX 我明白了。那么,Task.Yield 能解决您的问题吗?
    • 在我的 uwp 应用程序中,在桌面上运行得非常好,但在移动设备上,显示的是一个空白页面,而不是一个环。
    • @ravikumar 这似乎是一个不同的问题,你应该发布一个新问题
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2023-03-29
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多