在帧导航WPF期间显示RadBusyIndi​​cator

时间:2015-06-26 11:09:47

标签: wpf task ui-thread busyindicator

对于我们的应用程序,我们需要在导航期间显示忙碌指示器,因为某些控件需要花时间加载。通常,对于长时间运行的操作,我将创建一个单独的任务,并将触发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& RadBusyIndi​​cator& .Net 4.5

1 个答案:

答案 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是BusyIndi​​cator的值。在导航开始时,您必须将其设置为true。

希望这篇文章可以帮助你@!