Wordwrap para ListBoxes personalizados agregados programáticamente
Frecuentes
Visto 827 veces
1
Tengo un ListBoxItem personalizado que estoy tratando de agregar mediante programación a un ListBox, y quiero que se ajuste el contenido del elemento.
Aquí está el ListBoxItem personalizado:
class PresetListBoxItem : ListBoxItem
{
public uint[] preset;
public PresetListBoxItem(uint[] preset = null, string content = "N/A")
: base()
{
this.preset = preset;
this.Content = content;
}
}
Y el XAML:
<ListBox Name="sortingBox" Margin="5,5,0,5" Width="150" MaxWidth="150" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="2" CornerRadius="3" Margin="3">
<TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow" />
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Y el código que hace la adición:
PresetListBoxItem item = new PresetListBoxItem();
item.preset = new uint[] { };
item.Content = "This is a test of an extended line of text.";
sortingBox.Items.Add(item);
Cuando ejecuto el código, el elemento se agrega al cuadro, pero el borde no aparece en absoluto y no envuelve las líneas.
Busqué la respuesta en SO y Google, y usé ListBoxes y ListViews, pero nada parece funcionar.
1 Respuestas
0
ListBoxItem
es solo un contenedor para el contenido, respectivamente, elemento. Si desea utilizar su propia ListBoxItem
anula la plantilla del contenedor, no el artículo. Luego, para el enlace correcto en TextBlock
tienes que unirte a la Content
propiedad de su PresetListBoxItem.
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:PresetListBoxItem">
<Border BorderBrush="Black" BorderThickness="2" CornerRadius="3" Margin="3">
<TextBlock Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType=local:PresetListBoxItem}}"
TextWrapping="WrapWithOverflow" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
Pero creo que no es la mejor manera. ¿Por qué derivas de ListBoxItem
? Si no hace esto, su XAML estaría bien al instante.
item.Text = "This is a test of an extended line of text.";
class PresetListBoxItem
{
public uint[] preset;
public string Text { get; set; }
public PresetListBoxItem(uint[] preset = null, string content = "N/A")
: base()
{
this.preset = preset;
this.Text = content;
}
}
contestado el 23 de mayo de 12 a las 03:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# wpf listbox or haz tu propia pregunta.
Estoy usando una clase personalizada que se deriva de ListBoxItem porque necesito obtener el uint[] asociado cuando alguien selecciona ese elemento en ListBox. La única otra forma en que puedo pensar en hacerlo es vincular de alguna manera un índice a una Lista con ListBoxItem, y eso parece una forma propensa a errores de hacer las cosas. - abion47
Encontrará su clase con uint[] en el DataContext de ListBoxItem. - LPL