如何在WPF ComboBox中正确显示太长的文本

时间:2012-05-11 10:30:59

标签: wpf combobox texttrimming

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

4 个答案:

答案 0 :(得分:13)

ItemTemplate使用自定义ComboBoxTextBlock使用TextTrimming属性设置为CharacterEllipsis的{​​{1}}。

示例:

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

答案 1 :(得分:4)

正如罗斯所说,答案是实施自定义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内编写代码时,这将为您提供有关对象属性的提示。

答案 2 :(得分:0)

您可以使用TextTrimming CharacterEllipsisWordEllipsis作为组合框中的文本块。

答案 3 :(得分:0)

也适用于更复杂的数据模板;然而,我不得不求助于 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>