У меня есть список, чей набор данных содержит сетку. Внутри сетки У меня есть TextBlock, но я не могу получить TextWrapping свойство работает правильно: я написал образец для иллюстрации поведения:WPF TextWrapping различия между ListBox и ContentControl
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>
И это мой отделенного кода:
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();
}
}
}
В ContentControl и в первых 2 ListBoxes я использую один и тот же шаблон данных; в ContentControl WordWrapping работает как ожидалось (всякий раз, когда я изменяю размер окна), а в ListBoxes - нет. В чем разница?
Единственный способ заставить TextWrapping работать в ListBox - исправить ширину (или MaxWidth) TextBlock, но это не является желаемым поведением.
Спасибо, Алессандро
Большое спасибо Фил, он отлично работает, Ale – AleV