2 votes

Thème WPF TreeViewItems avec différents modèles de contrôle

J'essaie de créer différents thèmes pour un contrôle PropertyGrid personnalisé qui hérite de TreeView et utilise TreeViewItems comme conteneurs d'éléments. En outre, je souhaite définir le modèle de contrôle pour les TreeViewItems en fonction du type d'objet auquel le TreeViewItem est lié. Je préférerais remplir la grille de propriétés comme je le fais actuellement en définissant ItemsSource.

Actuellement, j'applique différents modèles de contrôle en fonction du type d'objet lié en définissant le sélecteur de style TreeViewItems.ItemContainerStyleSelector via un HierarchialDataTemplate. Dans ce sélecteur de style, je renvoie une ressource statique via une clé de ressource. J'aimerais ne pas utiliser ce sélecteur et cette méthode de clé de ressource, mais plutôt créer différents objets TreeViewItem dérivés en fonction du type de l'objet auquel il doit être lié. Cela me permettrait d'appliquer un style différent par thème en fonction du type, de la même manière que les autres contrôles sont thématisés. Mais je ne vois pas comment faire. La surcharge ItemsControl.GetContainerForItemOverride ferait ce que je veux si on lui passait l'objet à lier, ou au moins son type, mais je ne vois pas comment faire fonctionner cela. Comment faire ? Ou est-ce que je m'y prends mal ?

1voto

CodeNaked Points 23538

La meilleure solution consiste à ajouter une propriété de dépendance personnalisée en lecture seule à votre TreeViewItem personnalisé. À défaut d'un meilleur nom, appelons cela "Look". Cette propriété peut alors être une énumération avec les différents looks ou styles que vous souhaitez appliquer.

Vous pouvez ensuite créer un style unique pour votre élément TreeView personnalisé, qui utilise des déclencheurs de style basés sur la propriété Look pour modifier le modèle ou diverses autres propriétés.

Vous pouvez ensuite définir votre propriété Look dans un PrepareContainerForItemOverride (Préparer le conteneur pour l'élément) Les résultats de l'évaluation de la qualité de l'eau de boisson sont déterminés en fonction de l'article qui est donné.

En général, les ItemsControl s'attendent à ce que leur "conteneur" soit d'un seul type, mais cela n'est pas strictement appliqué. Mais comme vous l'avez dit, vous ne pouvez pas créer des conteneurs différents en fonction de l'élément qu'ils enveloppent.

En outre, la virtualisation ajoute un peu de complexité à l'ensemble. Dans ce cas, les conteneurs peuvent être réutilisés, de sorte que vous n'avez pas la possibilité d'en "créer" un nouveau du même type. Cependant, même si la virtualisation est activée, la fonction PrepareContainerForItemOverride sera appelée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X