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)
C'est exactement ce que je cherche. Merci beaucoup. :) – EdMelo
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
Oui, c'est un bug ennuyeux ... Cela n'arrive pas si le ME est défini dans un assembly séparé –