2010-11-16 13 views
5

Dans mon application wpf, j'ai besoin d'obtenir le pinceau de fond du bouton du thème pour dessiner l'arrière-plan d'un autre contrôle.Dans WPF, comment obtenir l'arrière-plan du bouton du thème actuel?

J'ai essayé referencing PresentationFramework.Aero.dll et en utilisant ButtonChrome, mais pas de chance jusqu'à présent. J'ai également essayé d'utiliser VisualStyleRenderer, mais il semble que cette classe ne peut être utilisée que pour dessiner l'arrière-plan (je ne peux pas obtenir un pinceau et le définir comme arrière-plan d'un autre contrôle).

Des idées?

Cordialement, Eduardo Melo

Répondre

9

Il peut être fait dans le code en regardant le style de bouton par défaut dans les ressources:

private static object GetValueFromStyle(object styleKey, DependencyProperty property) 
    { 
     Style style = Application.Current.TryFindResource(styleKey) as Style; 
     while (style != null) 
     { 
      var setter = 
       style.Setters 
        .OfType<Setter>() 
        .FirstOrDefault(s => s.Property == property); 

      if (setter != null) 
      { 
       return setter.Value; 
      } 

      style = style.BasedOn; 
     } 
     return null; 
    } 

    ... 

    this.Background = GetValueFromStyle(typeof(Button), BackgroundProperty) as Brush; 

Si vous devez le faire en XAML, vous pouvez facilement créer une extension de balisage du code ci-dessus:

public class ValueFromStyleExtension : MarkupExtension 
{ 
    public ValueFromStyleExtension() 
    { 
    } 

    public object StyleKey { get; set; } 
    public DependencyProperty Property { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (StyleKey == null || Property == null) 
      return null; 
     object value = GetValueFromStyle(StyleKey, Property); 
     if (value is MarkupExtension) 
     { 
      return ((MarkupExtension)value).ProvideValue(serviceProvider); 
     } 
     return value; 
    } 

    private static object GetValueFromStyle(object styleKey, DependencyProperty property) 
    { 
     Style style = Application.Current.TryFindResource(styleKey) as Style; 
     while (style != null) 
     { 
      var setter = 
       style.Setters 
        .OfType<Setter>() 
        .FirstOrDefault(s => s.Property == property); 

      if (setter != null) 
      { 
       return setter.Value; 
      } 

      style = style.BasedOn; 
     } 
     return null; 
    } 
} 

XAML

Background="{util:ValueFromStyle StyleKey={x:Type Button}, Property=Control.Background}"> 

EDIT: fixe ValueFromStyleExtension pour le cas où la valeur est définie comme une DynamicResource (ou d'une autre ME)

+0

C'est exactement ce que je cherche. Merci beaucoup. :) – EdMelo

+0

Une seule chose: pour ceux qui reçoivent le bogue "MS.Internal.Markup.MarkupExtensionParser + UnknowMarkupExtension", voici une solution: http://www.hardcodet.net/2008/04/nested-markup-extension-bug – EdMelo

+0

Oui, c'est un bug ennuyeux ... Cela n'arrive pas si le ME est défini dans un assembly séparé –