我正在开发适用于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);
}
注意:最后运行的任务使用Dictionary
,Windows.Storage.ApplicationData
和Navigation
作为另一页。
答案 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);
}