我希望在下拉内容左对齐的情况下,仅将组合框中选择的项目居中对齐。
为了实现这一点,我复制了默认组合框并修改了Toggle按钮的Content Presenter水平对齐方式为居中。
是否有更简单的方法来实现这一点而不是编辑整个模板?
为了实现这一点,我复制了默认组合框并修改了Toggle按钮的Content Presenter水平对齐方式为居中。
是否有更简单的方法来实现这一点而不是编辑整个模板?
<Style TargetType="ComboBox">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
我找到了一种方法,可以在不重新模板化ComboBox的情况下完成此操作:
<ComboBox HorizontalContentAlignment="Center">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility, RelativeSource={RelativeSource AncestorType=ComboBox}}" Value="Visible">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
<ComboBox HorizontalContentAlignment="Center">
将默认使所有项目居中-下拉列表中的项目和选择框中的项目。
ComboBoxItem
样式中的DataTrigger
会查找视觉树中的某个ComboBox
父级。由于下拉列表位于不属于主视觉树的Popup
中,因此这个DataTrigger
对于非选定项目总是失败的。所选项目作为主视觉树的一部分显示在ComboBox
中,因此该项的DataTrigger
成功,并且该项被对齐到Left
。
Visibility
部分有些随意。我需要一些可以预测值的属性,以便如果找到Combobox
源,则DataTrigger
始终会激活。在这种情况下,Visibility
不一定总是Visible
,但当它不可见时,您无法看到对齐方式,因此无关紧要。<ControlTemplate x:Key="ComboBoxControlTemplate1" TargetType="{x:Type ComboBox}">
<Grid x:Name="MainGrid" SnapsToDevicePixels="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
</Grid.ColumnDefinitions>
<Popup ...... />
<ToggleButton ...../>
<ContentPresenter ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="Center" IsHitTestVisible="False" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</ControlTemplate>
你只需要将触发器与ComboBoxItem的样式关联起来。
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="ContentPresenter">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>