2012-05-11 17 views
5

Tengo un ComboBox que muestra texto de varias longitudes. Para textos que no son largos, no hay problema. Para los textos más largos que el ancho de ComboBox, me gustaría recortar el texto y agregar "..." (una elipsis) al final para mostrarlos correctamente. La conclusión es que no quiero cambiar el ancho del ComboBox. ¿Alguien sabe como hacer esto?Cómo mostrar texto demasiado largo correctamente en WPF ComboBox

Respuesta

11

Utilice una costumbre ItemTemplate para su ComboBox, que hace uso de un TextBlock con la propiedad TextTrimming establecido en CharacterEllipsis.

Ejemplo:

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

El enlace que existe en el Combobox anteriormente no funciona en este formato – Prat

+0

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

0

Puede usar TextTrimmingCharacterEllipsis o WordEllipsis para los bloques de texto en su cuadro combinado.

0

La respuesta, como dijo Ross, es implementar una costumbre ItemTemplate. Sin embargo, para que funcione correctamente, debe realizar el enlace correctamente.

Una nota sobre este método: No puede establecer tanto el DisplayMemberPath como el ItemTemplate, debe ser uno o el otro.

Así, para el caso general en el que el miembro de pantalla es el elemento (como una cadena), puede utilizar la unión sin propiedades para unirse a la DataContext de la plantilla:

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

O, puedes ponerlo en un estilo.

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

Para el caso en el que desea enlazar a una propiedad específica del objeto, de forma similar a como se puede utilizar la propiedad DisplayMemberPath, reemplace la unión con la unión que se usaría para una propiedad en el objeto que eres vinculante Por lo tanto, sustituir la cuarta línea en mi primer ejemplo con algo como esto:

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

la unión es en el contexto de un único elemento del tipo ligado a su cuadro combinado. Para hacer esto más explícito, puede hacer lo siguiente:

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

esto le dará consejos para las propiedades en el objeto mientras se está escribiendo código en el interior del DataTemplate.

Cuestiones relacionadas