【问题标题】:How to display too long text properly in WPF ComboBox如何在 WPF ComboBox 中正确显示过长的文本
【发布时间】:2012-05-19 22:51:18
【问题描述】:

我有一个显示各种长度文本的组合框。对于不长的文本没有问题。对于长于 ComboBox 宽度的文本,我想修剪文本并在末尾添加“...”(省略号)以正确显示它们。底线是我不想改变 ComboBox 的宽度。有谁知道怎么做?

【问题讨论】:

    标签: wpf combobox texttrimming


    【解决方案1】:

    为您的ComboBox 使用自定义ItemTemplate,它使用TextBlock 并将TextTrimming 属性设置为CharacterEllipsis

    例子:

    <ComboBox ItemsSource="..." SelectedValuePath="...">
      <ComboBox.ItemTemplate>
        <DataTemplate>
          <TextBlock 
            Text="{Binding ...}" 
            TextTrimming="CharacterEllipsis" />
        </DataTemplate>
      </ComboBox.ItemTemplate>
    </ComboBox>
    

    【讨论】:

    • 以前存在于 Combobox 上的绑定在这种格式下不起作用
    【解决方案2】:

    正如罗斯所说,答案是实现自定义ItemTemplate。但是,要使其正常工作,您需要正确地进行绑定。

    关于此方法的注意事项:您不能同时设置DisplayMemberPathItemTemplate,它必须是一个或另一个。

    因此,对于显示成员为项目的一般情况(例如对于字符串),您可以使用不带属性的绑定来绑定到模板的DataContext

    <ComboBox ItemsSource="..." SelectedValuePath="...">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    或者,你可以把它放在一个样式中。

    <Style TargetType="{x:Type ComboBox}">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    对于要绑定到对象的特定属性的情况,类似于使用 DisplayMemberPath 属性的方式,将绑定替换为您将用于对象上的属性的绑定捆绑。因此,将我的第一个示例中的第四行替换为如下内容:

    <TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" />
    

    绑定是在绑定到您的 ComboBox 类型的单个项目的上下文中。为了使这一点更明确,您可以执行以下操作:

    <DataTemplate DataType="{x:Type namespace:MyItemType}">
        <!-- My DataTemplate stuff here -->
    </DataTemplate>
    

    当您在DataTemplate 中编写代码时,这将为您提供有关对象属性的提示。

    【讨论】:

    • 这个答案非常好,Lauraducky。回答老问题可能会有风险,以防一个人的工作似乎没有得到回报,但本页面的 5,917 多名读者中的一些人将从您的工作中受益。继续加油!
    • @halfer 谢谢。我当然没有因为期望得到很多赞成而回答,希望这对那里的人有用:)
    【解决方案3】:

    您可以将TextTrimming CharacterEllipsisWordEllipsis 用于组合框中的文本块。

    【讨论】:

      【解决方案4】:

      也适用于更复杂的 DataTemplate;但是,我不得不求助于 DockPanel 而不是标准 WrapPanel。

      <ComboBox>
        <ComboBox.ItemTemplate>
          <DataTemplate>
            <DockPanel>
              <AccessText DockPanel.Dock="Left" Text="{Binding Icon}"/>
              <TextBlock Text="{Binding Name}"  TextTrimming="CharacterEllipsis" />
            </DockPanel>
          </DataTemplate>
        </ComboBox.ItemTemplate>
      </ComboBox> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多