2012-05-16 2 views
0

У меня есть список, чей набор данных содержит сетку. Внутри сетки У меня есть 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, но это не является желаемым поведением.

Спасибо, Алессандро

ответ

2

ListBox содержит ScrollViewer, так что, когда содержание хочет быть шире, чем ListBox автоматически появляется полоса прокрутки. Решение состоит в том, чтобы отключить горизонтальную полосу прокрутки.

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

Большое спасибо Фил, он отлично работает, Ale – AleV

Смежные вопросы