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

时间:2010-11-16 20:12:35

标签: c# wpf wpf-controls

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

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

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

有什么想法吗?

亲切的问候, Eduardo Melo

1 个答案:

答案 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)的情况