如何在 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 中分配 Horizo​​ntalAlignment = "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 将始终失败。 selectedComboBox 中显示为主视觉树的一部分,因此 DataTrigger 对应那个项目成功,并且该项目对齐 Left.

Visibility 部分有些随意。我需要一些可以预测其值的 属性,因此如果找到 Combobox 源,DataTrigger 将始终激活。在这种情况下,Visibility 不一定总是 Visible,但如果不是,您无论如何也看不到对齐方式,所以没关系。