2009-07-18 6 views
1

J'essaie de personnaliser l'aspect d'une case à cocher dans WPF. J'espérais pouvoir récupérer le modèle de contrôle par défaut pour la classe BulletChrome définie dans PresentationFramework.Aero et travailler avec. Cependant, BulletChrome n'est pas une sous-classe de Control, il n'y a donc pas de modèle à modifier. Est-ce que quelqu'un sait que je pourrais le faire?Personnalisation de l'élément BulletChrome dans WPF

Répondre

3

Si vous voulez placer une sorte de BulletChrome dans le modèle « CheckBox où le BulletDecorator dans le modèle classique irait, vous pourriez le faire, puisque BulletChrome hérite de Decorator, qui hérite de FrameworkElement.

La prochaine partie, comment le BulletChrome obtient-il son apparence? Eh bien, c'est l'une des rares parties de WPF où ils traitent complètement le rendu sans xaml: L'apparence visuelle de ButtonChrome est définie dans sa méthode OnRender().

BulletChrome.OnRender(), du réflecteur:

protected override void OnRender(DrawingContext drawingContext) 
{ 
    Rect bounds = new Rect(0.0, 0.0, base.ActualWidth, base.ActualHeight); 
    this.DrawBackground(drawingContext, ref bounds); 
    this.DrawDropShadows(drawingContext, ref bounds); 
    this.DrawBorder(drawingContext, ref bounds); 
    this.DrawInnerBorder(drawingContext, ref bounds); 
} 

Malheureusement, étant donné que toutes ces méthodes appelées à l'intérieur OnRender() sont privées, vous ne pouvez pas jouer avec eux, même si vous la sous-classe ButtonChrome, peut-être seulement superposez une partie de votre rendu sur le dessus. Donc, fondamentalement, soit vous commencez à creuser le code de rendu dans Reflector et vous essayez de l'adapter et de le réécrire à vos besoins, soit vous lancez votre propre Template/Decorator/tout ce qui est à partir de zéro. (Mais alors ce n'est vraiment pas important ce que vous utilisez aussi longtemps que cela fonctionne, non?)

Espérons que cela a répondu à votre question, à votre santé.

+0

Merci pour la bonne information! – MadPokey

+0

Ce n'est pas très _WPF_ de Microsoft. – TernaryTopiary

1

Vous ne voulez pas faire cela. La modification du modèle de contrôle n'est pas censée modifier le comportement du contrôle, et un contrôle CheckBox, par définition, a trois états (coché, non coché, indéterminé).

Il est préférable de créer un contrôle personnalisé à 4 états (ou n états si vous préférez) qui emprunte beaucoup de Look/Feel au CheckBox ControlTemplate.

+0

Juste pour clarifier, je n'essaie pas de changer le comportement. La case à cocher aura toujours trois états. Je veux juste personnaliser l'apparence de l'élément ButtonChrome en fonction de certaines conditions. – MadPokey

0

Si BulletChrome n'est pas personnalisable, vous ne pouvez pas le personnaliser. Mais vous pouvez certainement le remplacer par quelque chose qui est personnalisable.

En termes pratiques, je suggère de commencer avec le thème de Silverlight au lieu de Aero.

Questions connexes