7
votes

Comment prerendra-t-il les contrôles sur un tabitem dans WPF?

C # XBAP Application

J'ai un tabcontrol avec quatre tabitems dedans. Deux de ces tabitems contiennent simplement un datagrid à partir de la WPFOOLKIT qui tire une base assez petite (100 lignes de 4 colonnes) à partir d'une base de données SQL Server. Mon problème est que lorsque je charge mon application et que je clique sur l'un des Tabitems contenant un DataGrid. Il me semble qu'une pause de 2-3 secondes avant d'apporter cet onglet dans la mise au point. Cela ne se produit que la toute première fois que l'onglet est cliqué. Il semble être le rendu du datagramrid.

Comment puis-je effectuer ces onglets préerender lorsque l'application se charge de manière à ce que lorsqu'un utilisateur clique sur un onglet, il n'y a pas cette pause initiale de 2-3 secondes avant l'entrée de l'onglet.

merci


3 commentaires

Ce qui serait encore mieux, c'est si les onglets pré-rendent dans un thread séparé après l'application a chargé


J'ai essayé d'utiliser un fil qui a appelé l'appel de la base de données et la mise à jour de l'itemSource pour le DataGrid, mais je reçois toujours cette pause initiale la première fois que l'onglet est cliqué.


Faites-vous un appel ASYNC DB ou une synchronisation? De plus, comment liez-vous le DataGrid à la table? Si vous utilisez un digne d'information, vous pouvez essayer de faire un rendement de retour


4 Réponses :


0
votes

Le problème ne reçoit pas les données (vous pouvez précharger cela dans un fil séparé), mais en réalité, la construction des éléments visuels dans la DataGrid.

Si vous vérifiez avec Snoop, vous pouvez voir qu'il existe de nombreux éléments visuels, si vous n'avez pas besoin de toutes les fonctionnalités de DataGrid, vous pouvez accéder à une représentation plus simple (listeView / itemsControl / personnalisé)


0 commentaires

7
votes

Nous utilisons l'onglet Standard WPF TabControl et le problème est-ce qui est la corbeille de VisualTree à chaque fois que vous modifiez le SELECTEDITEM.

Ce que nous avons fini par faire était de créer un tabcontrol spécial (je l'ai appelé Tabcontrolex) qui maintient tous les articles rendus mais choisit simplement d'afficher / masquer / masquer les éditeurs de contenu pour les tabitems.

Voici le code pertinent xxx

où vous pouvez gélifier quelque chose comme ça (vous pouvez Besoin de l'étendre pour la tabstriplocation gauche / droite) xxx

que vous pouvez utiliser comme celui-ci xxx

Ça fonctionne très bien et nous l'utilisons à un grand effet depuis longtemps maintenant


0 commentaires

0
votes

Chargez le contenu de l'onglet de manière dynamique sur la sélection, pour que l'interface utilisateur soit réactive, utilisez le code similaire à celui-ci:

 private void tab_Selected(object sender, EventArgs e)
{
   //Get the selected tab
 Action loadTab = delegate
{
  LoadSelectedTab(tabItem);
}
Dispatcher.BeginInvoke(DispatcherPriority.Background, loadTab);
}
public void LoadSelectedTab(TabItem item)
{
  item.Content = new EmployeeTab();
  .....
}


0 commentaires

0
votes

Impossible d'ajouter des commentaires mais je veux remercier Sacha pour la réponse et l'élargissez un peu. Il y avait un problème de chargement de ce tabcontrol, donc l'onglet premier n'a pas été affiché (non présent dans un arbre visuel). Ajout de code suivant aux "méthodes publiques / protégées" Région résout le problème.

    /// <summary>
    /// There was a flaky issue when first tab was uninitialized
    /// </summary>
    /// <param name="oldValue"></param>
    /// <param name="newValue"></param>
    protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
    {
        base.OnItemsSourceChanged(oldValue, newValue);
        UpdateSelectedItem();
    }


0 commentaires