39

如何在 a 的所有列标题上启用文本换行DataGrid,而不禁用其他默认标题功能?例如需要的列大小调整、排序方向指示符等。

有没有办法做到这一点?

4

5 回答 5

47

或者不要打扰 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> ...
于 2011-08-25T16:37:19.080 回答
24

我想在我的 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>
于 2010-07-14T13:22:02.310 回答
15

我添加&#x0a;到我希望文本换行的标题文本中。当您不需要将标题文本绑定到某些内容时,这很有用

<DataGridTextColumn x:Name="cAccountNumber" 
                    Header="Account&#x0a; Number" 
                    Width="80" 
                    Binding="{Binding Path=AccountNumber}" />
于 2015-07-01T06:05:09.943 回答
10

我没有将列名直接分配给 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>
于 2009-08-17T22:36:01.847 回答
1

您可以为列标题创建一个全局Style变量。没有任何示例标记,我不知道语法,但它应该看起来像这样:

<Style TargetType="{x:Type dg:ColumnHeader}">
    <Setter Property="TextWrapping" Value="Wrap"/>
</Style>

由于它Style是无键的,它将自动应用于您的所有列标题。并且样式不会覆盖任何本地设置的属性,因此它不会“禁用”任何现有的标头功能。

于 2009-08-17T20:55:47.260 回答