我试图让 ComboBox
匹配视觉设计,因此当 ComboBox
获得焦点时,它的 ToggleButton
有蓝色边框.我不知道该怎么做,也找不到示例。
当 ComboBox
获得焦点时,内部的 TextBox
获得虚线焦点视觉效果。如何将 ComboBox
焦点状态传递给 ToggleButton
,以便打开它的蓝色边框样式?
这是我的 ComboBox
模板:
<ControlTemplate x:Key="ComboBoxCT" TargetType="{x:Type ComboBox}">
<Grid x:Name="gLayoutRoot"
Margin="{TemplateBinding Margin}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
MinWidth="{TemplateBinding MinWidth}"
MinHeight="{TemplateBinding MinHeight}"
MaxWidth="{TemplateBinding MaxWidth}"
MaxHeight="{TemplateBinding MaxHeight}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
<ToggleButton x:Name="ToggleButton"
Grid.Column="2"
Focusable="false"
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press"
Style="{DynamicResource ComboBoxToggleStyle}"
/>
<AccessText x:Name="ContentSite"
Style="{StaticResource ComboBoxAccessTextStyle}"
Text="{TemplateBinding SelectionBoxItem}"
Foreground="{TemplateBinding Foreground}"/>
<TextBox x:Name="PART_EditableTextBox"
Style="{x:Null}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
VerticalAlignment="{TemplateBinding VerticalAlignment}"
Margin="2,3,17,2"
Focusable="True"
Background="{DynamicResource InnerBgLight}"
Visibility="Hidden"
IsReadOnly="{TemplateBinding IsReadOnly}">
<TextBox.Template>
<ControlTemplate TargetType="TextBox">
<Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}" />
</ControlTemplate>
</TextBox.Template>
</TextBox>
<Popup x:Name="Popup"
Placement="Bottom"
IsOpen="{TemplateBinding IsDropDownOpen}"
AllowsTransparency="True"
Focusable="False"
PopupAnimation="Slide">
<Grid x:Name="DropDown"
SnapsToDevicePixels="True"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}">
<Border x:Name="OuterBorder"
Style="{DynamicResource OuterBorderBottomRestStyle}"
Background="{DynamicResource InnerBorder}">
<Border x:Name="InnerBorder"
Style="{DynamicResource InnerBottomBorderStyle}">
<ScrollViewer x:Name="scvCbxItems" SnapsToDevicePixels="True">
<StackPanel x:Name="spCbxItemsPanel" IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Border>
</Border>
</Grid>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="InnerBorder" Property="MinHeight" Value="95"/>
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
<Trigger Property="IsEditable" Value="true">
<Setter Property="IsTabStop" Value="false"/>
<Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
<Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource FgDisabledBrush}"/>
<Setter Property="OpacityMask" TargetName="OuterBorder" Value="{DynamicResource OuterBgDisabledOpacityMask}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
这是我的 ToggleButton
模板:
<ControlTemplate x:Key="ComboBoxToggleCT" TargetType="{x:Type ToggleButton}">
<Border x:Name="OuterBorder"
Style="{DynamicResource OuterBorderTopRestStyle}">
<Border x:Name="InnerBorder"
Style="{DynamicResource InnerTopBorderStyle}">
<Path x:Name="Arrow"
HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="5"
Fill="{DynamicResource FgBrush}"
Data="{DynamicResource DownArrowGeometry}"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderTopSelectStyle}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="OpacityMask" TargetName="OuterBorder" Value="{DynamicResource OuterBgDisabledOpacityMask}"/>
<Setter Property="Fill" TargetName="Arrow" Value="{DynamicResource FgDisabledBrush}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderTopSelectStyle}"/>
<Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/>
</Trigger>
<!--<Trigger Property="IsKeyboardFocused" Value="True">-->
<Trigger Property="IsKeyboardFocused" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsFocused}">
<Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderBottomFocusStyle}"/>
<Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
如您所见,我尝试绑定(bind)到 ComboBox
的焦点状态,但这在 Trigger
中不起作用。
感谢任何帮助。对不起,菜鸟问题。谢谢!
最佳答案
执行此操作的最简单方法是绑定(bind)到模板化父级的 IsFocused。注意:Mode=OneWay 很重要,因为 IsFocused 是只读的。你可以这样做:
<DataTrigger Binding="{Binding IsFocused, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay}" Value="True">
<Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderBottomFocusStyle}"/>
<Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/>
</DataTrigger >
关于WPF 组合框 : how to set focus on it's togglebutton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935386/