我有一些切换按钮来控制一些选项卡的可见性。按钮的样式使它们在按下时变为蓝色,不按时变为灰色。问题是,当一个切换按钮被按下,然后另一个,第一个将切换回灰色,但有一个蓝色的轮廓。如果选择了其他控件(不是切换按钮之一),则该按钮将变为灰色,没有蓝色轮廓。我不想要蓝色的轮廓。
我的风格是:
<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
设置在选项卡上。
我认为您的问题是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>
你的问题很可能是焦点视觉风格。您可以通过在资源中添加以下结构来摆脱它:
<!-- 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}"/>
这样可以去掉蓝色的轮廓。
在。net 4.0中,我刚刚添加了这个
<Style TargetType="ToggleButton">
<Setter Property="Focusable" Value="False" />
</Style>
当我切换另一个按钮时,它删除了蓝色轮廓,但按钮不能再通过键盘聚焦。