Отображение индикатора IsBusy на MainFrame при навигации по страницам Silverlight - PullRequest
0 голосов
/ 24 января 2011

Я использую Silverlight 4 Navigation Framework и у меня есть страницы, загрузка которых занимает некоторое время (обычно привязка к большим объемам данных).

Я поместил элемент управления IsBusy SL Toolkit на мэйнфрейм, и я хочу установить его на «Занят», когда вы нажимаете на переход на другую страницу, и на «NotBusy», когда другая страница завершит загрузку.

Для простоты и начала работы я исключаю MVVM и просто использую вызовы с выделенным кодом, но мой элемент управления IsBusy никогда не появляется. Я предполагаю, что это проблема с потоками пользовательского интерфейса, но мне нужна помощь, пожалуйста.

РЕДАКТИРОВАТЬ : На простой странице элемент управления IsBusy появляется, но только после загрузки запрашиваемой страницы (а затем она отключается, поэтому вы ее никогда не видите). Мне нужна вызывающая страница, чтобы вызвать элемент управления IsBusy в родительском фрейме и отобразить его, прежде чем он попытался даже загрузить следующую страницу ...

Вот XAML на моей странице MainFrame:

   <Grid x:Name="LayoutRoot">
        <navigation:Frame
            x:Name="ContentFrame"... NavigationFailed="ContentFrame_NavigationFailed">
            <navigation:Frame.UriMapper>
                   ...
            </navigation:Frame.UriMapper>
        </navigation:Frame>

        <telerik:RadBusyIndicator
            x:Name="busyIndicator"
            BusyContent="Please wait..." />
    </Grid>

и вот код на странице, которая переходит на другую страницу:

    private void workorderButton_Click(object sender, RoutedEventArgs e)
    {
        ((MainPage) App.GetApp.RootVisual).busyIndicator.IsBusy = true;
        NavigationService.Navigate(new Uri("WorkOrderView", UriKind.Relative));
    }

и затем на странице назначения:

    public WorkOrderView()
    {
        InitializeComponent();

        ((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = false;
    }

Я пробовал так много разных вариантов, но индикатор так и не появился. Я попытался обернуть его в какой-то многопоточный код, а затем он отобразился, но выдал недопустимое перекрестное поточное исключение.

Я тестировал XAML, используя этот код (кнопка на той же странице), и он отлично работает (показывает и скрывает):

    private void btnIsBusy_Click(object sender, RoutedEventArgs e)
    {
        ((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = true;
        ThreadPool.QueueUserWorkItem((state) =>
        {
            Thread.Sleep(3 * 1000);
            Dispatcher.BeginInvoke(() => ((MainPage)App.GetApp.RootVisual).busyIndicator.IsBusy = false);
        });
    }

Я уверен, что это связано с темой пользовательского интерфейса ... любая помощь приветствуется!

Спасибо

1 Ответ

0 голосов
/ 24 января 2011

Я бы порекомендовал взглянуть на интерфейс INavigationContentLoader, представленный в Silverlight 4, который дает вам прекрасное место для подключения к навигационной системе и выполнения таких действий "глобально" (для всех навигационных систем), как это.

Смотрите сообщение в блоге Дэвида Полла о том, как сделать что-то очень похожее на это, здесь: http://www.davidpoll.com/2010/02/01/on-demand-loading-of-assemblies-with-silverlight-navigation-revisited-for-silverlight-4-beta/

Он делает что-то гораздо более сложное, чем вам нужно (загрузка страниц из удаленных XAP), но посмотрите, что он делаетс помощью элемента управления BusyIndicator, и, надеюсь, довольно легко увидеть, как раздеться и использовать только этот кусок (он предоставляет источник для всех своих вещей, так что вы можете копать сколько угодно).

Если этоПохоже, больше работы, чем необходимо для вашего проекта, другой способ, которым вы могли бы сделать это, это подключиться к Frame.Navigated и Frame.Navigating - создать логическое свойство для элемента управления, размещающего фрейм, установите его в true в Frame.Navigating и обратно в false в Frame.Navigated и использовать привязку данных для привязки этого логического свойства к вашему элементу управления IsBusy.

...