如何在 WPF 中居中对齐组合框所选项目
How to center align combobox selected item in WPF
我希望组合框选择的项目单独居中对齐,而下拉内容左对齐。
为此,我制作了默认组合框的完整副本,并将 Toggle 按钮水平对齐方式的 Content Presenter 修改为居中
有没有比编辑整个模板更简单的方法来实现此目的
您只需要一个与 ComboBoxItem 样式关联的触发器。
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Trigger>
</Style.Triggers>
</Style>
在 ComboBox 的 ControlTemplate 中的 ContentPresenter 中分配 HorizontalAlignment = "Center"
<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>
一个对我有用的简单方法:
<Style TargetType="ComboBox">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
我找到了一种无需重新模板组合框即可执行此操作的方法:
<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
将始终失败。 selected 项 是 在 ComboBox
中显示为主视觉树的一部分,因此 DataTrigger
对应那个项目成功,并且该项目对齐 Left
.
Visibility
部分有些随意。我需要一些可以预测其值的 属性,因此如果找到 Combobox
源,DataTrigger
将始终激活。在这种情况下,Visibility
不一定总是 Visible
,但如果不是,您无论如何也看不到对齐方式,所以没关系。
我希望组合框选择的项目单独居中对齐,而下拉内容左对齐。
为此,我制作了默认组合框的完整副本,并将 Toggle 按钮水平对齐方式的 Content Presenter 修改为居中
有没有比编辑整个模板更简单的方法来实现此目的
您只需要一个与 ComboBoxItem 样式关联的触发器。
<Style TargetType="ComboBoxItem">
<Style.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Trigger>
</Style.Triggers>
</Style>
在 ComboBox 的 ControlTemplate 中的 ContentPresenter 中分配 HorizontalAlignment = "Center"
<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>
一个对我有用的简单方法:
<Style TargetType="ComboBox">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
我找到了一种无需重新模板组合框即可执行此操作的方法:
<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
将始终失败。 selected 项 是 在 ComboBox
中显示为主视觉树的一部分,因此 DataTrigger
对应那个项目成功,并且该项目对齐 Left
.
Visibility
部分有些随意。我需要一些可以预测其值的 属性,因此如果找到 Combobox
源,DataTrigger
将始终激活。在这种情况下,Visibility
不一定总是 Visible
,但如果不是,您无论如何也看不到对齐方式,所以没关系。