10

さまざまな長さのテキストを表示するComboBoxがあります。長くないテキストの場合、問題はありません。ComboBoxの幅より長いテキストの場合、テキストをトリミングし、最後に「...」(省略記号)を追加して正しく表示したいと思います。肝心なのは、ComboBoxの幅を変更したくないということです。誰かがこれを行う方法を知っていますか?

4

4 に答える 4

13

のカスタムItemTemplateを使用しますComboBox。これはTextBlockTextTrimmingプロパティがに設定されたaを使用しCharacterEllipsisます。

例:

<ComboBox ItemsSource="..." SelectedValuePath="...">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock 
        Text="{Binding ...}" 
        TextTrimming="CharacterEllipsis" />
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>
于 2012-05-11T10:38:10.013 に答える
8

ロスが言ったように、答えはカスタムを実装することです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

于 2018-01-30T00:36:02.197 に答える
0

TextTrimming を使用するCharacterEllipsisWordEllipsis、コンボボックスのテキストブロックに使用できます。

于 2012-05-11T10:36:45.657 に答える
0

より複雑な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> 
于 2021-02-21T19:51:36.727 に答える