对于我们的应用程序,我们需要在导航期间显示忙碌指示器,因为某些控件需要花时间加载。通常,对于长时间运行的操作,我将创建一个单独的任务,并将触发UI线程中的忙指示符,但在这种情况下,我无法做到这一点。
一旦忙指针开始旋转,它就会受到Frame.Source或Frame.Navigate的干扰,它也会在ui线程中执行。如此忙碌的指标隐藏起来。
以下是我用于导航的一段代码。这是作为单独的任务执行的。
public virtual void NavigateTo(string pageKey, object parameter)
{
Frame frame = null;
Action actionToExecuteOnUIContext = () =>
{
frame = GetDescendantFromName(Application.Current.MainWindow, "ContentFrame") as Frame;
if (frame != null)
{
frame.LoadCompleted -= frame_LoadCompleted;
frame.LoadCompleted += frame_LoadCompleted;
frame.Source = _pagesByKey[pageKey];
frame.DataContext = parameter;
}
};
Application.Current.Dispatcher.BeginInvoke(actionToExecuteOnUIContext, DispatcherPriority.Normal);
}
}
任何解决此问题的方法
WPF& RadBusyIndicator& .Net 4.5
答案 0 :(得分:0)
为了显示繁忙的指示器,你必须使用后台线程,因为导航也需要UI线程。
我建议使用这样的东西:
protected async void Navigation(string pageKey, object parameter)
{
await NavigateTo(pageKey,parameter).ContinueWith((t) =>
{// do UI stuff
Dispatcher.CurrentDispatcher.InvokeAsync(delegate
{
IsBusy = false;
});
},
//sync with UI thread
TaskScheduler.FromCurrentSynchronizationContext());
}
/// <summary>
/// This method needs to be async to perform async binding
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private async Task NavigateTo(string pageKey, object parameter)
{
//your async method
}
其中IsBusy是BusyIndicator的值。在导航开始时,您必须将其设置为true。
希望这篇文章可以帮助你@!