在WPF中,如何获取当前主题的按钮背景?

在我的wpf应用程序中,我需要获取主题的按钮背景画笔来绘制另一个控件的背景。

我尝试引用PresentationFramework.Aero.dll并使用ButtonChrome,但到目前为止还没有运气。

我也尝试过使用VisualStyleRenderer,但似乎这个类只能用于绘制背景(我无法获得画笔并将其设置为另一个控件的背景)。

有任何想法吗?

亲切的问候,Eduardo Melo

可以通过查找资源中的默认按钮样式在代码中完成:

private static object GetValueFromStyle(object styleKey, DependencyProperty property) { Style style = Application.Current.TryFindResource(styleKey) as Style; while (style != null) { var setter = style.Setters .OfType() .FirstOrDefault(s => s.Property == property); if (setter != null) { return setter.Value; } style = style.BasedOn; } return null; } ... this.Background = GetValueFromStyle(typeof(Button), BackgroundProperty) as Brush; 

如果您需要在XAML中执行此操作,则可以从上面的代码轻松创建标记扩展:

 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() .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}"> 

编辑:修复了ValueFromStyleExtension用于将值定义为DynamicResource (或另一个ME)的情况