如何在WPF中将ComboBox的选定项居中对齐

4
我希望在下拉内容左对齐的情况下,仅将组合框中选择的项目居中对齐。
为了实现这一点,我复制了默认组合框并修改了Toggle按钮的Content Presenter水平对齐方式为居中。
是否有更简单的方法来实现这一点而不是编辑整个模板?

1
简而言之,除了更改控件模板之外,没有简单的方法来实现这一点。@XAML爱好者的答案适用于更改下拉列表(弹出窗口)中所选项目的对齐方式,但不会影响在切换按钮中显示的项目的对齐方式。 - Steven Rands
谢谢,我只使用了控件模板。 - keerthee
5个回答

2
一个对我很有效的简单方法是:
<Style TargetType="ComboBox">
    <Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>

1

我找到了一种方法,可以在不重新模板化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成功,并且该项被对齐到LeftVisibility部分有些随意。我需要一些可以预测值的属性,以便如果找到Combobox源,则DataTrigger始终会激活。在这种情况下,Visibility不一定总是Visible,但当它不可见时,您无法看到对齐方式,因此无关紧要。

0
在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>

0

你只需要将触发器与ComboBoxItem的样式关联起来。

    <Style TargetType="ComboBoxItem">
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Trigger>
        </Style.Triggers>
    </Style>

不,它并没有起作用,内容仍然是左对齐的。 - keerthee
你确定这个样式应用于你的 ComboBoxItem 吗? - Jawahar
1
是的,实际上它会将组合下拉框中先前选择的项目居中对齐,但我只需要在切换按钮中选定的项目居中对齐,而下拉菜单中的元素则左对齐。 - keerthee

0
<Style TargetType="ContentPresenter">
    <Setter Property="HorizontalAlignment" Value="Center" />
</Style>

1
你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接