2010-03-30 6 views
4

Je suis à la recherche d'un bon moyen de simplifier et d'organiser un contrôle personnalisé WPF complexe. Ma première pensée est de le factoriser en deux contrôles plus simples. Pour des raisons d'explication, j'appellerai SimpleControl et AdvancedControl.Quelle est une bonne façon de factoriser et de simplifier un contrôle personnalisé WPF compliqué?

SimpleControl contient toutes les fonctionnalités de base et est extrêmement réutilisable. AdvancedControl dépend de SimpleControl et contient la gestion des entrées et des cloches et des sifflets supplémentaires.

AdvancedControl est moins réutilisable que SimpleControl car il contient des éléments d'interface utilisateur supplémentaires et une gestion des entrées spécifiques aux applications.

Le modèle visuel pour AdvancedControl est ce qui définit la dépendance à SimpleControl. Lorsque OnApplyTemplate est appelé, il met en cache une référence au SimpleControl intégré.

Le principal problème de cette approche est que toutes les propriétés et méthodes disponibles sur SimpleControl I doivent également être disponibles sur AdvancedControl. Cela signifie beaucoup de travail en implémentant les mêmes propriétés et méthodes de dépendance sur AdvancedControl, puis en les transmettant à SimpleControl. Cela ne semble pas particulièrement élégant. J'ai aussi pensé à hériter de AdvancedControl de SimpleControl mais je pense que dans ce cas je devrais redéfinir complètement le template visuel pour SimpleControl au lieu de simplement réutiliser celui existant.

Quelqu'un peut-il penser à une meilleure façon de factoriser un contrôle personnalisé WPF complexe?

Répondre

1

Vous pouvez hériter du style:

<Style TargetType="{x:Type AdvancedControl}" BasedOn="{x:Type SimpleControl}" /> 
+0

Ceci est une chose intéressante à apprendre, mais en fait il ne me permet pas vraiment. Ce n'est pas le style que je veux réutiliser dans AdvancedControl. Je souhaite réutiliser et étendre le modèle visuel défini dans le style. Existe-t-il un équivalent à 'BasedOn' que je peux utiliser avec le modèle visuel? –

+0

Peut-être mettre le modèle dans vos ressources, puis le référencer avec {StaticResource x}? – CMerat

Questions connexes