【问题标题】:Outline around toggle button in WPFWPF中切换按钮周围的轮廓
【发布时间】:2011-10-13 20:20:08
【问题描述】:

我有一些切换按钮来控制某些选项卡的可见性。按钮的样式设置为按下时变为蓝色,不按下时变为灰色。问题是,当按下一个切换按钮时,第一个切换按钮将切换回灰色但有蓝色轮廓。如果选择了其他一些控件(不是切换按钮之一),则该按钮将变为灰色而没有蓝色轮廓。我不想要蓝色轮廓。

我的风格是:

<Style x:Key="TabToggleButtonStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Background" Value="lightGray"/>
    <Setter Property="Margin" Value="3" />
    <Setter Property="Padding" Value="7,2,7,2" />
    <Style.Triggers>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="Background" Value="#FF41B8F2" />
        </Trigger>
    </Style.Triggers>
</Style>

切换:

<DockPanel LastChildFill="False">
  <ToggleButton
      DockPanel.Dock="Right"
      Style="{StaticResource TabToggleButtonStyle}"
      Click="BtnOneClick"
      IsChecked="{Binding ElementName=_mainTabControl, Path=BtnOneTab.IsSelected}"
      Content="Agent Info"/>

    <ToggleButton
      DockPanel.Dock="Right"
      Style="{StaticResource TabToggleButtonStyle}"
      Click="BtnTwoClick"
      IsChecked="{Binding ElementName=_mainTabControl, Path=BtnTwoTab.IsSelected}"
      Content="Help"/>
</DockPanel>

点击命令在标签上设置IsSelected = true

【问题讨论】:

    标签: wpf styles togglebutton


    【解决方案1】:

    我认为您的问题是ToggleButton 的模板使用ButtonChrome 来设置可能状态的样式,例如IsKeyboardFocused

    因此,当您取消选中 ToggleButton 时,它仍然具有键盘焦点(因为您刚刚单击了它),所以它仍然是这样的样式。

    ToggleButton 的默认模板如下所示

    <ControlTemplate TargetType="{x:Type ToggleButton}">
        <MS_Themes:ButtonChrome x:Name="Chrome"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}"
                                RenderMouseOver="{TemplateBinding IsMouseOver}"
                                RenderPressed="{TemplateBinding IsPressed}"
                                RenderDefaulted="{TemplateBinding Button.IsDefaulted}"
                                SnapsToDevicePixels="true">
            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                              Margin="{TemplateBinding Padding}"
                              RecognizesAccessKey="True"
                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </MS_Themes:ButtonChrome>
        <ControlTemplate.Triggers>
            <Trigger Property="IsKeyboardFocused" Value="true">
                <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
            </Trigger>
            <Trigger Property="IsChecked" Value="true">
                <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="#ADADAD"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    删除IsKeyboardFocused 触发器应该可以解决您的问题(这还需要您添加对 PresentationFramework.Aero 的引用)。但是由于您不能只更改模板的某些部分(这是全有或全无的交易),因此您必须重写它

    所以ToggleButton 样式将是

    <Style x:Key="TabToggleButtonStyle" TargetType="{x:Type ToggleButton}">
        <Setter Property="Background" Value="lightGray"/>
        <Setter Property="Margin" Value="3" />
        <Setter Property="Padding" Value="7,2,7,2" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}"
                                 xmlns:MS_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
                    <MS_Themes:ButtonChrome x:Name="Chrome"
                                            BorderBrush="{TemplateBinding BorderBrush}"
                                            Background="{TemplateBinding Background}"
                                            RenderMouseOver="{TemplateBinding IsMouseOver}"
                                            RenderPressed="{TemplateBinding IsPressed}"
                                            RenderDefaulted="{TemplateBinding Button.IsDefaulted}"
                                            SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                            Margin="{TemplateBinding Padding}"
                                            RecognizesAccessKey="True"
                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </MS_Themes:ButtonChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#ADADAD"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Background" Value="#FF41B8F2" />
            </Trigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 这是我第一个 .Net 项目的第 18 天,如果我说任何荒谬的话,请多多包涵。我试过你的模板,它有几个错误,VS 2010 不喜欢 xmlns:MS_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 参考并将其替换为 clr-namespace:Microsoft.Windows .Themes;assembly=PresentationFramework.Luna。此外,Background 属性是只读的,因此无法从 xaml 设置,因此我将其删除。在这些更改之后,按钮的轮廓没有问题,但颜色是错误的。灰色/浅灰色而不是浅灰色/蓝色。
    • 我做了一些实验,但无法改变颜色。
    • 将 Aero 导入项目并将&lt;Setter Property="Background" TargetName="Chrome" Value="#FF41B8F2" /&gt; 添加到&lt;ControlTemplate.Triggers&gt; IsChecked 触发器后一切正常。谢谢:)
    • 要让“MS_Themes”命名空间正常工作,您必须正确注册它(即将xmlns:MS_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 添加到您的 XAML 根节点——Expression Blend 会自动为您完成此操作)。
    【解决方案2】:

    您的问题很可能是焦点视觉样式。您可以通过将此构造添加到您的资源中来摆脱它:

    <!-- StyleNoFocusRect -->
    <Style x:Key="StyleNoFocusRect">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Control}">
                    <Canvas></Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    然后将其添加到您的 ToggleButton 样式中:

    <Setter Property="FocusVisualStyle" Value="{StaticResource StyleNoFocusRect}"/>
    

    那应该摆脱你的蓝色轮廓。

    【讨论】:

    • 感谢您的帮助,但不幸的是,这对我不起作用
    【解决方案3】:

    在 .net 4.0 中,我刚刚添加了这个

    <Style TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False" />
    </Style>
    

    当我切换另一个按钮时,它去除了蓝色轮廓,但该按钮无法再通过键盘成为焦点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2021-01-05
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多