【问题标题】:WPF DataGrid: How do I set columns to TextWrap?WPF DataGrid:如何将列设置为 TextWrap?
【发布时间】:2015-04-17 08:11:20
【问题描述】:

我不确定为什么我的代码没有正确执行 TextWrapping。它不包装描述列的文本(这是我想要的)。它只是将其切断,甚至不使用“...”让我知道还有更多数据。

我尝试使用我在网上找到的这段代码来完成这项工作,但它不起作用。理想情况下,我希望能够只将 TextWrap 设置为某些列,而不是一般地跨所有 DataGridCell 对象。

哦,请注意我使用的是 Microsoft.NET 4,所以这是通过它提供的 DataGrid,而不是来自 WPF 工具包。

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding IntTypes}" SelectedValue="{Binding CurrentIntType}">
 <DataGrid.Resources>
  <Style TargetType="{x:Type DataGridCell}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type DataGridCell}">
      <Border Name="DataGridCellBorder">
       <TextBlock Background="Transparent" TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" Height="auto" Width="auto">
        <ContentPresenter Content="{TemplateBinding Property=ContentControl.Content}"  ContentTemplate="{TemplateBinding Property=ContentControl.Content}" />
       </TextBlock>
      </Border>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </DataGrid.Resources>
 <DataGrid.Columns>
  <DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" />
  <DataGridTextColumn Header="Interested Parties Description" Binding="{Binding Description}" IsReadOnly="False"  />
 </DataGrid.Columns>
</DataGrid>

提前致谢!

【问题讨论】:

    标签: wpf datagrid word-wrap


    【解决方案1】:

    它不起作用,因为 TextBlock 的“Text”属性实际上被设置为另一个对象,而不仅仅是一个字符串。在运行时,您的 VisualTree 看起来像:

    Cell
      - TextBlock (w/ TextWrapping and TextTrimming)
        -  ContainerVisual
           -  ContentPresenter
              -  TextBlock (auto-generated by the DataGrid)
    

    简而言之,你的代码本质上是在做这样的事情:

    <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow">
      <TextBlock Text="The quick brown fox jumps over the lazy dog"/>
    </TextBlock>
    

    要解决此问题,请尝试按如下方式更新您的 ControlTemplate:

    <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border Name="DataGridCellBorder">
            <ContentControl Content="{TemplateBinding Content}">
                <ContentControl.ContentTemplate>
                    <DataTemplate>
                        <TextBlock Background="Transparent" TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" 
                                    Height="auto" Width="auto" Text="{Binding Text}"/>
                    </DataTemplate>
                </ContentControl.ContentTemplate>
            </ContentControl>
        </Border>
    </ControlTemplate>
    

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 2019-06-05
      • 2016-09-18
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2011-12-18
      • 2014-10-23
      相关资源
      最近更新 更多