在我的wpf应用程序中,我需要获取主题的按钮背景画笔来绘制另一个控件的背景。
我尝试引用PresentationFramework.Aero.dll并使用ButtonChrome,但到目前为止还没有运气。
我也尝试过使用VisualStyleRenderer,但似乎这个类只能用于绘制背景(我无法获取画笔并将其设置为另一个控件的背景)。
有什么想法吗?
亲切的问候, Eduardo Melo
答案 0 :(得分:9)
可以通过查找资源中的默认按钮样式在代码中完成:
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;
如果您需要在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<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}">
编辑:修复了ValueFromStyleExtension
,用于将值定义为DynamicResource
(或其他ME)的情况