WPF TextWrapping diferencias entre ListBox y ContentControl

Tengo un cuadro de lista cuya plantilla de datos contiene una cuadrícula. Dentro de la cuadrícula tengo un TextBlock, pero no puedo hacer que la propiedad TextWrapping funcione correctamente: escribí una muestra para ilustrar el comportamiento:

XAML:

<Window x:Class="MyTest.Test"
    xmlns:my="clr-namespace:MyTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" >
<Window.Resources>
    <DataTemplate DataType="{x:Type my:Task}">
        <Border BorderThickness="2" BorderBrush="Red">
            <Grid ShowGridLines="True">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock MaxWidth="50" Margin="3" Grid.Column="0" TextWrapping="Wrap" Text="{Binding Path=Description}"></TextBlock>
                <TextBlock Margin="3" Grid.Column="1" TextWrapping="Wrap"  Text="{Binding Path=LongDescription}"></TextBlock>
            </Grid>
        </Border>
    </DataTemplate>
</Window.Resources>
<StackPanel>

    <TextBlock FontWeight="Bold" TextWrapping="Wrap">ContentControl: the textwrapping works as expected (select a row in the first listbox)</TextBlock>
    <ContentControl MinHeight="10" Content="{Binding ElementName=lsTask, Path=SelectedItem}" />

    <TextBlock FontWeight="Bold" TextWrapping="Wrap">ListBox: I can't get the textwrapping work properly</TextBlock>
    <ListBox MinHeight="10" Name="lsTask" ItemsSource="{Binding Path=TaskList}" ></ListBox>

    <TextBlock FontWeight="Bold" TextWrapping="Wrap">ListBox 2 : I tried with HorizontalContentAlignment="Stretch": similar but doesn't wrap</TextBlock>
    <ListBox MinHeight="10" Name="lsTask2" ItemsSource="{Binding Path=TaskList}" HorizontalContentAlignment="Stretch" ></ListBox>



    <TextBlock FontWeight="Bold" TextWrapping="Wrap">ListBox 3: I can wrap only setting Width in the datatemplate</TextBlock>
    <ListBox MinHeight="10" Name="lsTask3" ItemsSource="{Binding Path=TaskList}" HorizontalContentAlignment="Stretch" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border BorderThickness="2" BorderBrush="Green">
                    <Grid ShowGridLines="True">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <TextBlock Margin="3" Grid.Column="0" TextWrapping="Wrap" Text="{Binding Path=Description}"></TextBlock>
                        <TextBlock  Width="200"  Margin="3" Grid.Column="1" TextWrapping="Wrap"  Text="{Binding Path=LongDescription}"></TextBlock>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>


    </ListBox>
</StackPanel>

Y este es mi código detrás:

namespace MyTest
{

public class Task
{
    public string Description { get; set; }
    public string LongDescription { get; set; }

}

public class MyContext
{
    public List<Task> TaskList { get; set; }

    public MyContext()
    {
        TaskList = new List<Task>();
        TaskList.Add(new Task() { Description = "description1", LongDescription = "long long long long long long long long description1" });
        TaskList.Add(new Task() { Description = "description2", LongDescription = "long long long long long long long long description2" });
        TaskList.Add(new Task() { Description = "description3", LongDescription = "long long long long long long long long description3" });
    }

}


public partial class Test : Window
{

    public Test()
    {   
        DataContext = new MyContext();
        InitializeComponent();

    }
}
}

En ContentControl y en los primeros 2 ListBoxes utilizo la misma plantilla de datos; en ContentControl, WordWrapping funciona como se esperaba (siempre que cambio el tamaño de la ventana), mientras que en ListBoxes no lo hace. ¿Cuál es la diferencia?

La única forma que encontré para hacer que TextWrapping funcione en ListBox es corregir el ancho (o MaxWidth) de TextBlock, pero no es el comportamiento deseado.

Gracias, Alessandro

preguntado el 16 de mayo de 12 a las 17:05

1 Respuestas

El ListBox contiene un ScrollViewer, por lo que cuando el contenido quiere ser más ancho que el ListBox, aparece automáticamente una barra de desplazamiento. La solución es deshabilitar la barra de desplazamiento horizontal.

<ListBox ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

contestado el 16 de mayo de 12 a las 19:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.