2013-03-11 1 views
0

J'ai une application WPF qui s'exécute en tant que XBAP dans un navigateur. Sur quelques pages, tous les contrôles sont créés dynamiquement en fonction de ce que l'utilisateur sélectionne. Pour cette raison, il peut sembler que l'application ne fait rien tant que tous les contrôles ne sont pas chargés. Je voudrais avoir une sorte d'indicateur occupé affiché à la main pour montrer à l'utilisateur que les contrôles sont en cours de chargement, il ne doit pas être animé bien que ce serait bien si c'était le cas. J'ai regardé dans l'indicateur occupé de telerik mais ceci ne fonctionne pas car c'est vraiment pour obtenir des données pour un contrôle simple et ne montre pas jusqu'à ce que les contrôles soient chargés qui défait le but.WPF Meilleure façon d'afficher un indicateur occupé lors de la création dynamique d'une page

Je pensais d'abord afficher une superposition, ou quelque chose de similaire, contenant un logo de chargement, puis charger la page derrière celle-ci et cacher la superposition lorsque les commandes ont été chargées. Je me demandais si c'était la meilleure façon d'y parvenir ou s'il y avait un meilleur moyen?

+0

Il n'y a pas de meilleur moyen que toutes les opérations UI doivent se produire dans le thread UI. Je suis inquiet, à propos de votre déclaration «Sur quelques pages, tous les contrôles sont créés dynamiquement en fonction de ce que l'utilisateur sélectionne». Cela semble que vous n'avez pas appliqué les modèles appropriés (MVVM) et que vous créez tous ces éléments d'interface utilisateur dans le code, ce qui serait mauvais et pourrait potentiellement causer tous ces problèmes de performance. montrer du code et peut-être que nous pouvons vous aider avec cela. –

+0

Malheureusement, je ne suis pas autorisé à poster du code, mais une page peut contenir des boîtes de texte, des listes déroulantes, des listes déroulantes, des commandes utilisateur, etc. que l'utilisateur peut afficher ou masquer sur la page. personnalisable C'est le chargement de ces contrôles qui peut prendre le temps. C'est MVVM mais j'ai hérité du code alors peut-être qu'il y a quelque chose d'autre qui pourrait être fait aussi. Bravo de toute façon devra regarder cela et la superposition alors. – knappster

+0

@knappster Comme le dit HighCode, il ne devrait pas être nécessaire de "charger" les contrôles personnalisés. Il existe quelques techniques disponibles pour y parvenir. Vous pouvez utiliser DataTriggers pour afficher/masquer certains contrôles en fonction d'une valeur de propriété, vous pouvez résumer vos ensembles de contrôles à UserControls et utiliser un DataTemplate (n'importe quel DataTemplateSelector) pour contrôler quel UserControl est utilisé. De toute façon je vais essayer d'offrir une réponse à votre vrai problème (sablier souris ci-dessous) – failedprogramming

Répondre

2

Note: Je n'ai pas essayé ceci dans une application de navigateur XBAP, mais cela fonctionne dans WPF Apps sans aucun problème! J'utilise un DispatcherTimer pour afficher un sablier lorsque cela est nécessaire, et abstrait ce code dans une classe statique.

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(); 
     } 
    } 
} 

Vous l'utiliser comme ceci:

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

Hope this helps!

+0

A bientôt, je vais essayer le navigateur XBAP et voir si ça marche. – knappster

+0

Fonctionne un régal en XBAP ainsi, à votre santé. – knappster

Questions connexes