如何在所有列标题上启用文本换行?

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&#x0a; 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 或Horizo​​ntalAlignment 来做到这一点单独

<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”,那么我可以获得所需的结果。 内容不包头怎么样?

以上是关于如何在所有列标题上启用文本换行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不裁剪或换行的情况下限制列宽?

如何在已格式化的字符串上添加文本换行或字符限制[重复]

在将文本全部放入另一列之前,如何更喜欢将文本换行?

如何使用 Lanyon 在 Jekyll 中启用水平滚动

wxPython styledtextctrl:如何在启用自动换行的情况下获取可见行数?

如何在C#/ wpf中启用datagrid列文本