Как отобразить слишком длинный текст правильно в WPF комбобокс

У меня есть ComboBox, который показывает текст различной длины. Для текстов, которые не длинны, нет проблем. Для текстов длиннее ширины ComboBox я хотел бы обрезать текст и добавить "..."(многоточие) в конце, чтобы показать их должным образом. Суть в том, что я не хочу изменять ширину ComboBox. Кто-нибудь знает, как это сделать?

3 ответов


используйте пользовательский ItemTemplate для ComboBox, который использует TextBlock С TextTrimming свойство имеет значение CharacterEllipsis.

пример:

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

ответ, Как сказал Росс, заключается в реализации пользовательского ItemTemplate. Однако, чтобы он работал правильно, вам нужно правильно выполнить привязку.

примечание по этому методу: вы не можете установить оба DisplayMemberPath и ItemTemplate, это должно быть одно или другое.

Итак, для общего случая, когда элемент отображения является элементом (например, для строки), вы можете использовать привязку без свойств для привязки к 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.


можно использовать TextTrimming CharacterEllipsis или WordEllipsis для текстовых блоков в вашем combobox.