В WPF как получить фон кнопки текущей темы? - PullRequest
6 голосов
/ 16 ноября 2010

В моем wpf-приложении мне нужно получить кисть фона кнопки темы, чтобы нарисовать фон другого элемента управления.

Я пытался ссылаться на PresentationFramework.Aero.dll и использовать ButtonChrome, но пока не получилось.

Я также пытался использовать VisualStyleRenderer, но кажется, что этот класс можно использовать только для рисования фона (я не могу получить кисть и установить ее в качестве фона другого элемента управления).

Есть идеи?

С уважением, Эдуардо Мело

1 Ответ

9 голосов
/ 17 ноября 2010

Это можно сделать в коде, посмотрев стиль кнопки по умолчанию в ресурсах:

    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}">

EDIT: исправлено ValueFromStyleExtension для случая, когда значение определено как DynamicResource (или другой ME)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...