2013-03-11 8 views
0

У меня есть приложение WPF, которое работает как XBAP в браузере. На нескольких страницах все элементы управления динамически создаются в зависимости от того, что пользователь выбирает. Из-за этого может показаться, что приложение ничего не делает, пока все элементы управления не будут загружены. Я бы хотел, чтобы перед вами показывался какой-то индикатор занятости, чтобы показать пользователю, что элементы управления загружаются, не нужно анимировать, хотя было бы неплохо, если бы это было так. Я просмотрел индикатор занятости telerik, но это не работает, поскольку он действительно предназначен для получения данных для одного элемента управления и не отображается до тех пор, пока элементы управления не будут загружены, что победит цель.WPF Лучший способ отображения индикатора занятости при динамическом создании страницы

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

+0

Нет лучшего способа, поскольку все операции пользовательского интерфейса должны возникать в потоке пользовательского интерфейса. Тем не менее я беспокоюсь о вашем заявлении 'На нескольких страницах все элементы управления динамически создаются в зависимости от того, что пользователь выбирает'. Похоже, что вы не применили правильные шаблоны (MVVM) и создаете все эти элементы пользовательского интерфейса в коде, что было бы плохо, и потенциально может вызвать все эти проблемы с производительностью. показать код и, возможно, мы сможем помочь вам в этом. –

+0

К сожалению, мне не разрешено публиковать код, но в основном страница может содержать множество текстовых полей, списков, выпадающих списков, элементов управления пользователя и т. Д., Которые пользователь может отображать или скрывать на странице в зависимости от того, что им нужно, настраиваемый. Это загрузка этих элементов управления, которые могут занять время. Это MVVM, но я унаследовал код, поэтому, возможно, есть что-то еще, что можно было бы сделать. Привет всем в любом случае придется посмотреть на это и наложение тогда. – knappster

+0

@knappster Как и то, что сказал HighCode, не нужно «загружать» настраиваемые элементы управления. Для достижения этой цели существует несколько методов. Вы можете использовать DataTriggers для отображения/скрытия определенных элементов управления на основе значения свойства, вы можете абстрагировать свои наборы элементов управления в UserControls и использовать DataTemplate (любой DataTemplateSelector) для управления использованием UserControl. В любом случае, я постараюсь предложить ответ для вашей реальной проблемы (песочные часы для мыши ниже) – failedprogramming

ответ

2

Примечание: я не пробовал это в приложении браузера XBAP, но он работает в приложениях WPF без проблем! Я использую DispatcherTimer, чтобы показать песочные часы, когда это необходимо, и отрисуйте этот код до статического класса.

public static class UiServices 
{ 

    /// <summary> 
    /// A value indicating whether the UI is currently busy 
    /// </summary> 
    private static bool IsBusy; 

    /// <summary> 
    /// Sets the busystate as busy. 
    /// </summary> 
    public static void SetBusyState() 
    { 
     SetBusyState(true); 
    } 

    /// <summary> 
    /// Sets the busystate to busy or not busy. 
    /// </summary> 
    /// <param name="busy">if set to <c>true</c> the application is now busy.</param> 
    private static void SetBusyState(bool busy) 
    { 
     if (busy != IsBusy) 
     { 
      IsBusy = busy; 
      Mouse.OverrideCursor = busy ? Cursors.Wait : null; 

      if (IsBusy) 
      { 
       new DispatcherTimer(TimeSpan.FromSeconds(0), DispatcherPriority.ApplicationIdle, dispatcherTimer_Tick, Application.Current.Dispatcher); 
      } 
     } 
    } 

    /// <summary> 
    /// Handles the Tick event of the dispatcherTimer control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
    private static void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
     var dispatcherTimer = sender as DispatcherTimer; 
     if (dispatcherTimer != null) 
     { 
      SetBusyState(false); 
      dispatcherTimer.Stop(); 
     } 
    } 
} 

Вы бы использовать его как это:

void DoSomething() 
{ 
    UiServices.SetBusyState(); 
    // Do your thing 
} 

Надеется, что это помогает!

+0

Привет, я дам это в браузере XBAP и посмотрю, работает ли он. – knappster

+0

Работает с удовольствием в XBAP, а также ура. – knappster