Почему фон кнопки по умолчанию имеет серый цвет, если IsPressed имеет значение true - PullRequest
1 голос
/ 27 апреля 2010

У меня простая проблема. Используя триггер IsPressed, я хочу установить цвет фона кнопки, отличный от серого по умолчанию. Вот как выглядит кнопка, когда она не нажата
alt text

и вот как это выглядит при нажатии
alt text

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

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
        </Trigger>
        <!-- This is the trigger which is working but the background color wont change -->
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
        </Trigger>
    </Style.Triggers>  

Вот весь стиль, как вы можете видеть, это стиль по умолчанию, применяемый ко всем кнопкам в приложении.

<Style TargetType="Button">
    <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>

Вот окончательное решение (спасибо всем, кто помог)

  1. Создайте шаблон элемента управления для общей кнопки и выполните привязку данных:

    <ControlTemplate TargetType ="Button" x:Key="ButtonControlTemplate">
         <Border Background="{TemplateBinding Background}"
                 BorderThickness="{TemplateBinding BorderThickness}"
                 BorderBrush="{TemplateBinding BorderBrush}"
                 CornerRadius="3">
             <Grid>
                 <ContentPresenter ContentSource="{TemplateBinding Content}" 
                                   ContentTemplate="{TemplateBinding ContentTemplate}"
                                   VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
             </Grid>           
         </Border>
    </ControlTemplate>
    
  2. Добавить шаблон управления в стиль:

    <Style TargetType="Button">
        <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="Template" Value="{DynamicResource ButtonControlTemplate}" />
        <Setter Property="BorderThickness" Value="1" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
                <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    

Примечание: BorderThickness по умолчанию равен 1, потому что в противном случае он не показывает

1 Ответ

1 голос
/ 27 апреля 2010

Проблема заключается в шаблоне управления по умолчанию для темы windows xp luna. Если вы измените тему в свойствах отображения на классическую, ваш стиль будет работать.

Должна быть возможность переопределить системные цвета в wpf, но я не смог решить вашу проблему с этим решением, возможно, цвет заморожен, поэтому его нельзя изменить или класс для создания тематического вида , ButtonChrome, сломан.

Я думаю, что вам лучше всего создать собственный шаблон управления для кнопки.

...