Показать RadBusyIndicator во время навигации по кадрам WPF

Для нашего приложения нам нужно отображать индикатор занятости во время навигации, поскольку для загрузки некоторых элементов управления требуется время. Обычно для длительной работы я создаю отдельную задачу и запускаю индикатор занятости в потоке пользовательского интерфейса, но в этом случае я не мог этого сделать.

Как только индикатор занятости начал вращаться, его побеспокоили Frame.Source или Frame.Navigate, которые также выполняются в потоке пользовательского интерфейса. настолько занятый индикатор спрятан.

Ниже приведен фрагмент кода, который я использовал для навигации. Это выполняется как отдельная задача.

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


person Max_dev    schedule 26.06.2015    source источник


Ответы (1)


Чтобы отобразить индикатор занятости, вы должны использовать фоновый поток, потому что для навигации также требуется поток пользовательского интерфейса.

Я предлагаю использовать что-то вроде этого:

    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, чтобы начать навигацию.

Надеюсь, этот пост поможет вам @!

person Dragos Stoica    schedule 26.06.2015
comment
Не помогает. Мой пост отличается тем, что когда у вас есть индикатор занятости, работающий в потоке пользовательского интерфейса, выполнение какого-либо другого действия в потоке пользовательского интерфейса снова блокирует индикатор занятости. Итак, как загрузить фрейм без блокировки индикатора занятости - person Max_dev; 26.06.2015