删除ToggleButton令人讨厌的背景鼠标悬停在样式上

时间:2018-07-12 18:49:30

标签: wpf togglebutton

我有简单的ToggleButton,并且当IsChecked我只想更改文本时。 我希望所有其他属性,例如borderbackground都将是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>

1 个答案:

答案 0 :(得分:1)

通常令人讨厌的一件事是,默认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。 (并且,如果您需要在触发器中更改背景,请像我对内容所做的那样,将背景属性移至设置器)

希望有帮助...