【问题标题】:Text wrapping, grid and star sizing文字环绕、网格和星号大小
【发布时间】:2010-12-21 09:57:22
【问题描述】:

我有一些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>

这使用来自WPF TextBox and Scroll behaviorBorder 技巧来强制文本换行工作,但列的宽度是设置的最小宽度或最长的单词(如果更大)。

有谁知道强制列适应网格宽度的方法?

【问题讨论】:

标签: wpf grid textblock word-wrap


【解决方案1】:

你确定要换行吗?或者你的目标是文本修剪?我问是因为当我在 kaxaml 中键入以下 xaml 时,中间列中的文本被完美包裹:

<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"

也可能是您没有提供所有数据,以重现您描述的问题...

【讨论】:

  • 谢谢,但这满足了三个要求中的两个:正确换行并且列扩展为网格的宽度;但是列宽会随着实际数据而变化 - 你的对齐非常漂亮,因为你对每一行使用相同的数据。我没能做的是让文本换行,列以适合列表框的宽度以及列宽对于每行保持一致。
  • 你能添加一张图片来显示你正在尝试做什么吗?还是看不懂。。
  • @amaca 我想你可能一直在寻找SharedSizeGroup
猜你喜欢
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多