如何在所有列标题上启用文本换行?
Posted
技术标签:
【中文标题】如何在所有列标题上启用文本换行?【英文标题】:How do I enable text wrapping on all column headers? 【发布时间】:2010-11-20 07:56:01 【问题描述】:如何在DataGrid
的所有列标题上启用文本换行,而不禁用其他默认标题功能?比如需要的列大小调整、排序方向指示符等。
有没有办法做到这一点?
【问题讨论】:
【参考方案1】:我将

添加到我希望文本换行的标题文本中。当您不需要将标题文本绑定到某些内容时,这很有用
<DataGridTextColumn x:Name="cAccountNumber"
Header="Account
 Number"
Width="80"
Binding="Binding Path=AccountNumber" />
【讨论】:
谢谢! - 来自 Web 技术的 WPF 新手,对于所有这些样式来说,这不应该是令人讨厌的困难。内联抛出一些东西。完成!【参考方案2】:我没有将列名直接分配给 DataGridColumn.Header 属性,而是创建了一个包含列名的 TextBlock,将 TextBlock 的 TextWrapping 属性设置为“Wrap”,并将 TextBlock 分配给 DataGridColumn.Header 属性。这保留了默认的标头功能。
例子:
<toolkit:DataGridTextColumn Binding="Binding Path=MyProperty">
<toolkit:DataGridTextColumn.Header>
<TextBlock Text="Something Longer" TextWrapping="Wrap" />
</toolkit:DataGridTextColumn.Header>
</toolkit:DataGridTextColumn>
【讨论】:
【参考方案3】:或者不要打扰 app.xaml 文件中的原语并执行以下操作(我的对象):
<DataGrid Name="WBdataGrid" AutoGenerateColumns="False" ColumnHeaderHeight="50" >
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="Binding"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns> ...
【讨论】:
这似乎有一个不幸的效果,即删除了我的表格以前通过 XAML 中的 Material Design 拥有的一些样式。【参考方案4】:我想启用文本换行 在我的 DataGrid 的所有列标题上, 不禁用其他默认值 标题功能
您需要将以下命名空间添加到您的 app.xaml 文件中:
xmlns:primitives="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit"
然后将此标记添加到 app.xaml:
<Style TargetType="x:Type primitives:DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="Binding"></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
这将为整个 WPF 应用程序中所有 DataGrid 的标题添加文本换行。
虽然我们正在讨论这个主题,但如果您只想居中每个 DataGrid 标题的文本,您可以改用以下样式:
<Style TargetType="x:Type primitives:DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
</Style>
然而我已经看到这么多 WPF 文章建议您只能通过在每个DataGrid 列上添加TextWrapping 或HorizontalAlignment 来做到这一点单独:
<toolkit:DataGridTextColumn Binding="Binding Path=TaxAmount">
<toolkit:DataGridTextColumn.HeaderTemplate >
<DataTemplate>
<TextBlock Text="Tax Amount" Width="90" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</DataTemplate>
</toolkit:DataGridTextColumn.HeaderTemplate>
</toolkit:DataGridTextColumn>
【讨论】:
哇,在我查找问题前一小时,您就给出了一个很好的答案。 +1 我不知道为什么,但我尝试了你所有的代码,但它没有使文本居中? 绝妙的解决方案。仅供参考,我在 ResourceDictionary 中定义了一个现有的 ColumnHeaderStyle,并简单地将 Setter Property -to- Setter 块粘贴到其中。它就像一个魅力,改变了所有具有这种风格的数据网格的外观,而不需要引用原语或 WPF 工具包。【参考方案5】:您可以为列标题创建一个全局 Style
。没有任何示例标记,我不知道语法,但它应该看起来像这样:
<Style TargetType="x:Type dg:ColumnHeader">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
由于Style
是无键的,它将自动应用于您的所有列标题。而且样式不会覆盖任何本地设置的属性,因此它不会“禁用”任何现有的标头功能。
【讨论】:
感谢您的建议,但我无法让这种方法发挥作用。但是,我确实发现,如果不是将字符串分配给 DataGridColumn.Header 属性,而是创建一个包含我的字符串的 TextBlock 并将文本块的 TextWrapping 属性设置为“Wrap”,那么我可以获得所需的结果。 内容不包头怎么样?以上是关于如何在所有列标题上启用文本换行?的主要内容,如果未能解决你的问题,请参考以下文章