さまざまな長さのテキストを表示するComboBoxがあります。長くないテキストの場合、問題はありません。ComboBoxの幅より長いテキストの場合、テキストをトリミングし、最後に「...」(省略記号)を追加して正しく表示したいと思います。肝心なのは、ComboBoxの幅を変更したくないということです。誰かがこれを行う方法を知っていますか?
4 に答える
のカスタムItemTemplate
を使用しますComboBox
。これはTextBlock
、TextTrimming
プロパティがに設定されたaを使用し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
プロパティに使用するバインディングに置き換えます。したがって、最初の例の4行目を次のように置き換えます。
<TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" />
バインディングは、ComboBoxにバインドされたタイプの単一アイテムのコンテキストにあります。これをより明確にするために、次のようにすることができます。
<DataTemplate DataType="{x:Type namespace:MyItemType}">
<!-- My DataTemplate stuff here -->
</DataTemplate>
これにより、内にコードを記述しているときに、オブジェクトのプロパティのヒントが得られますDataTemplate
。
TextTrimming を使用するCharacterEllipsis
かWordEllipsis
、コンボボックスのテキストブロックに使用できます。
より複雑なDataTemplateでも機能します。ただし、標準のWrapPanelではなくDockPanelを使用する必要がありました。
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<DockPanel>
<AccessText DockPanel.Dock="Left" Text="{Binding Icon}"/>
<TextBlock Text="{Binding Name}" TextTrimming="CharacterEllipsis" />
</DockPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>