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

bil*_*low 8 wpf combobox texttrimming

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

Ros*_*oss 13

使用自定义ItemTemplate你的ComboBox,这使得使用的TextBlockTextTrimming属性设置为CharacterEllipsis.

例:

<ComboBox ItemsSource="..." SelectedValuePath="...">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock 
        Text="{Binding ...}" 
        TextTrimming="CharacterEllipsis" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)


Lau*_*cky 5

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

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

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

<ComboBox ItemsSource="..." SelectedValuePath="...">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其放在样式中。

<Style TargetType="{x:Type ComboBox}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

对于要绑定到对象的特定属性的情况(与使用该DisplayMemberPath属性的方式类似),请将绑定替换为要用于绑定对象的属性的绑定。因此,将第一个示例中的第四行替换为以下内容:

<TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" />
Run Code Online (Sandbox Code Playgroud)

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

<DataTemplate DataType="{x:Type namespace:MyItemType}">
    <!-- My DataTemplate stuff here -->
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

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