首页 > 解决方案 > 删除 ToggleButton 烦人的背景鼠标悬停样式

问题描述

我很简单ToggleButton,当IsChecked我只想更改文本时。我想要所有其他属性,例如border并且background将是Transparent,但似乎我仍然有这个background style

<ToggleButton x:Name="changeButBorderedBlinky" Content="EDIT" Width="40" Height="40" Background="Transparent">
      <ToggleButton.Style>
           <Style TargetType="{x:Type ToggleButton}">
               <Style.Triggers>
                   <Trigger Property="IsMouseOver" Value="true">
                         <Setter Property="Content" Value="Done"/>
                         <Setter Property="FontWeight" Value="Bold"/>
                    </Trigger>
                </Style.Triggers>
           </Style>
       </ToggleButton.Style>
</ToggleButton>

标签: wpftogglebutton

解决方案


经常令人讨厌的一件事是默认 WPF 控件的某些视觉方面以某种方式编码,因此它们是不可配置的。MouseOver 背景就是一个例子(滚动条大小是另一个例子...... grrr !!!)。您可以通过为 ToggleButton 定义您自己的模板并消除该 MouseOver 触发器来解决此问题。这是一个简单的例子:

<ToggleButton x:Name="changeButBorderedBlinky" Width="40" Height="40" Background="Transparent">
    <ToggleButton.Style>
        <Style TargetType="{x:Type ToggleButton}">
            <Setter Property="Content" Value="EDIT"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                        <Border x:Name="border"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}"
                            SnapsToDevicePixels="True">
                                <ContentPresenter x:Name="contentPresenter"
                                                  ContentTemplate="{TemplateBinding ContentTemplate}"
                                                  Content="{TemplateBinding Content}"
                                                  ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                                  Focusable="False"
                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                  Margin="{TemplateBinding Padding}"
                                                  RecognizesAccessKey="True"
                                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Content" Value="Done"/>
                    <Setter Property="FontWeight" Value="Bold"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

此外,为了更改触发器中的属性,必须在样式中设置它,而不是直接设置。这就是为什么您的内容不会在 MouseOver 触发器中更改的原因。如果您删除它的属性设置并将其添加到带有 Setter 的样式中,它将允许触发器更改它。

所有这一切的一个缺点是它覆盖了所有默认模板触发器,因此除非您也为“IsChecked”添加触发器,否则您将看不到 ToggleButton 何时被选中。(如果您需要更改触发器中的背景,请将背景属性移动到设置器,就像我为内容所做的那样)

希望有帮助...


推荐阅读