Как отобразить слишком длинный текст правильно в 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.