2012-05-11 1 views
5

Ho un ComboBox che mostra il testo di varie lunghezze. Per i testi che non sono lunghi non c'è un problema. Per i testi più lunghi della larghezza di ComboBox vorrei tagliare il testo e aggiungere "..." (un'ellissi) alla fine per mostrarli correttamente. La linea di fondo è che non voglio cambiare la larghezza del ComboBox. Qualcuno sa come fare questo?Come visualizzare correttamente un testo troppo lungo in WPF ComboBox

risposta

11

Utilizzare un personalizzato per la tua ItemTemplateComboBox, che si avvale di un TextBlock con la TextTrimming proprietà impostata a CharacterEllipsis.

Esempio:

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

Il binding esistente sul Combobox in precedenza non funziona in questo formato – Prat

+0

http://stackoverflow.com/questions/18825882/combobox-textwrap-binding – Prat

0

È possibile utilizzare TextTrimmingCharacterEllipsis o WordEllipsis per i blocchi di testo nella casella combinata.

0

La risposta, come ha detto Ross, è quello di implementare una consuetudine ItemTemplate. Tuttavia, per farlo funzionare correttamente, è necessario eseguire correttamente il binding.

Una nota su questo metodo: non è possibile impostare sia lo DisplayMemberPath né lo ItemTemplate, deve essere uno o l'altro.

Così, per il caso generale in cui il membro display è l'oggetto (come ad esempio per una stringa), è possibile utilizzare vincolante con immobili di legarsi al DataContext del modello:

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

Oppure, puoi metterlo in uno stile.

<Style TargetType="{x:Type ComboBox}"> 
    <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{Binding }" TextTrimming="CharacterEllipsis" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Per il caso in cui si desidera associare ad una proprietà specifica dell'oggetto, simile a come si usa la proprietà DisplayMemberPath, sostituire il legame con il legame che si usa per una proprietà sull'oggetto che sei vincolante. Quindi, sostituire la quarta linea nel mio primo esempio con qualcosa di simile:

<TextBlock Text="{Binding MyDisplayMemberProperty}" TextTrimming="CharacterEllipsis" /> 

Il legame è nel contesto di un singolo elemento del tipo legato alla tua casella combinata. Per rendere questo più esplicito, è possibile effettuare le seguenti operazioni:

<DataTemplate DataType="{x:Type namespace:MyItemType}"> 
    <!-- My DataTemplate stuff here --> 
</DataTemplate> 

questo vi darà suggerimenti per le proprietà sull'oggetto mentre si sta scrivendo il codice all'interno del DataTemplate.