Обтекание текстом, сетка и размеры звезд - PullRequest
4 голосов
/ 29 ноября 2009

У меня есть некоторые text data, которые я хочу отобразить в Grid, с тремя столбцами, средний столбец в два раза шире, чем два других, занимая всю ширину сетки. text длинный и должен быть упакован. То, что я не могу получить на работу (и из других запросов здесь в прошлом, я вижу, что у других были подобные проблемы), это перенос слов и определение размера сетки для работы. Что у меня есть:

<Window.Resources>
  <local:DTData x:Key="dtData" />
</Window.Resources>

<StackPanel DataContext="{StaticResource dtData}">
  <ListBox ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Grid>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <Border x:Name="a" Grid.Column="0" Margin="4"/>
          <TextBlock Margin="4" Grid.Column="0" TextWrapping="Wrap" 
                     Text="{Binding A}" Width="{Binding ActualWidth, ElementName=a }" MinWidth="100"/>
          <Border x:Name="b" Grid.Column="1" Margin="4"/>
          <TextBlock Margin="4" Grid.Column="1" TextWrapping="Wrap" 
                     Text="{Binding B}" Width="{Binding ActualWidth, ElementName=b }" MinWidth="100"/>
          <Border x:Name="c" Grid.Column="2" Margin="4"/>
          <TextBlock Margin="4" Grid.Column="2" TextWrapping="Wrap" 
                     Text="{Binding C}" Width="{Binding ActualWidth, ElementName=b }" MinWidth="100"/>
        </Grid>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>

При этом используется Border трюк из WPF TextBox и поведение Scroll , чтобы принудительно работать перенос текста, но ширина столбца - либо минимальная установленная ширина, либо самое длинное слово, если оно больше.

Кто-нибудь знает способ заставить столбцы соответствовать ширине сетки?

1 Ответ

1 голос
/ 30 ноября 2009

Вы уверены, что хотите обернуть текст? Или ваша цель - обрезка текста? Я спрашиваю, потому что, когда я набираю следующий xaml в kaxaml, текст в среднем столбце прекрасно переносится:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
    <StackPanel>
  <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" Width="350">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Grid>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <TextBlock Margin="4" Grid.Column="0" TextWrapping="Wrap" 
                     Text="Binding A"  MinWidth="100"/>
          <TextBlock Margin="4" Grid.Column="1" TextWrapping="Wrap" 
                     Text=" Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco"  MinWidth="100"/>
          <TextBlock Margin="4" Grid.Column="2" TextWrapping="Wrap" 
                     Text="Binding C" MinWidth="100"/>
        </Grid>
      </DataTemplate>
    </ListBox.ItemTemplate>
    <TextBlock Text="" />
    <TextBlock Text=""/>
    <TextBlock Text=""/>
  </ListBox>
  </StackPanel>
  </Grid>
</Page>

Если вы хотите обрезать текст, просто установите TextWrapping="NoWrap" и TextTrimming на TextTrimming="CharacterEllipsis", где это необходимо.

Также может быть, что вы не предоставили все данные, чтобы воспроизвести проблему, которую вы описываете ...

...