代码之家  ›  专栏  ›  技术社区  ›  Carlos Melo

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

  •  6
  • Carlos Melo  · 技术社区  · 14 年前

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

    我试过引用PresentationFramework.Aero.dll并使用ButtonChrome,但到目前为止还没有成功。

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

    有什么想法吗?

    谨致问候, 爱德华多·梅洛

    1 回复  |  直到 14 年前
        1
  •  9
  •   Thomas Levesque    14 年前

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

        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 (或另一个我)