【问题标题】:How to center align combobox selected item in WPF如何在WPF中居中对齐组合框选定项
【发布时间】:2021-03-04 23:19:48
【问题描述】:

我希望组合框选定的项目单独居中对齐,而下拉内容左对齐。

为了实现这一点,我制作了默认组合框的完整副本,并将切换按钮水平对齐的 Content Presenter 修改为居中

有没有比编辑整个模板更简单的方法来实现这一点

【问题讨论】:

  • 简而言之,除了更改控件模板之外,没有其他简单的方法可以做到这一点。 @XAML Lover 的答案适用于更改下拉菜单(弹出窗口)中所选项目的对齐方式,但不会影响切换按钮中显示的项目的对齐方式。
  • 谢谢,我只用了控制模板

标签: c# wpf xaml combobox


【解决方案1】:

一种对我有用的简单方法:

<Style TargetType="ComboBox">
    <Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>

【讨论】:

    【解决方案2】:

    您只需要一个与 ComboBoxItem 样式关联的触发器。

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

    【讨论】:

    • 不,实际上它不起作用,内容仍然保持左对齐
    • 您确定将此样式应用于您的 ComboBoxItem 吗?
    • 是的,实际上它使组合下拉列表中先前选择的项目居中对齐,但我只需要切换按钮中的选定项目居中对齐,下拉列表中的元素左对齐
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我想出了一种无需重新模板化组合框的方法:

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

      &lt;ComboBox HorizontalContentAlignment="Center"&gt; 将默认将所有项目设置为居中 - 下拉列表中的项目和选择框中的项目。

      ComboBoxItem 样式中的 DataTrigger 在可视化树中的某处查找 ComboBox 父级。由于下拉列表位于Popup 内,它不是主视觉树的一部分,因此此DataTrigger 对于未选择的项目将始终失败。 选中显示在ComboBox内作为主视觉树的一部分,因此该一项的DataTrigger成功,并且该项对齐@ 987654330@.

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        相关资源
        最近更新 更多