Re: [WPF] - DrawingBrush from Matthew MacDonald
От: MxKazan Россия  
Дата: 07.07.09 07:04
Оценка: 42 (3)
Здравствуйте, Smarty, Вы писали:

S>Все работает, мышой можно елозить как угодно. Так что имет в виду МЭТР?

Под какой ОСью запускал? Под Висту, например, всё как МакДональд описал. Когда мышка над кнопкой, та игнорит Background. А дело всё в том, как реализован стандартный шаблон кнопки. Он содержит в себе класс ButtonChrome, который и рисует внешний вид кнопки.

Итак, смотрим часть XAML'а шаблона:
<Style x:Key="BaseButtonStyle"
       TargetType="{x:Type ButtonBase}">
    <Setter Property="Background"
            Value="{StaticResource ButtonNormalBackground}"/>
    ...
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ButtonBase}">
                <theme:ButtonChrome ...
                                    Fill="{TemplateBinding Background}" 
                                    ...
                                    RenderMouseOver="{TemplateBinding IsMouseOver}"
                                    ...>
                    <ContentPresenter ... />
                </theme:ButtonChrome>
                ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


А теперь код того, чем на самом деле ButtonChrome закрашивает фон (подробнее см. PresentationFramework.<theme>.dll):
private Brush Background
{
    get
    {
        if (!base.IsEnabled)
        {
            if (this.ThemeColor == ThemeColor.NormalColor)
            {
                return CommonDisabledFillNC;
            }
            if (this.ThemeColor == ThemeColor.Homestead)
            {
                return CommonDisabledFillHS;
            }
            return CommonDisabledFillM;
        }
        ThemeColor themeColor = this.ThemeColor;
        if (this.RenderPressed)
        {
            switch (themeColor)
            {
                case ThemeColor.NormalColor:
                    return CommonPressedFillNC;

                case ThemeColor.Homestead:
                    return CommonPressedFillHS;
            }
            return CommonPressedFillM;
        }
        if (this.RenderMouseOver && (themeColor == ThemeColor.Metallic))
        {
            return CommonHoverFillM;
        }
        return this.Fill;
    }
}


Из кода четко видно, что в определенных случаях плевать Хром хотел на то, что мы задали в качестве фона кнопки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.