如何在WPF DataGrid的列标题中设置垂直文本?

3

实际上,我指的是将文本从水平方向旋转-90度。

我需要这样做是因为标题文本很长,但单元格值很短,我想在屏幕上放置很多列。

这是否容易实现,还是我需要先了解资源和模板? 我不介意使用"hack"的解决方案!

2个回答

17
这将旋转整个列标题单元格:
<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="LayoutTransform">
            <Setter.Value>
                <RotateTransform Angle="270" />
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>

注意: 这意味着HorizontalContentAlignment现在是VerticalContentAlignment,反之亦然。


请注意,这种方法会干扰数据表格的列调整大小行为。 - Commodore63

4
这里还有另一种方法来实现它:
    <Style x:Key="soDataGrid_ColumnHeaderRotateStyle" TargetType="DataGridColumnHeader" >
    <Setter Property="ContentTemplate" >
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding}"
                           FontWeight="Bold" Width="60"
                           VerticalAlignment="Center" TextAlignment="Center"
                           HorizontalAlignment="Center">
                    <TextBlock.LayoutTransform>
                        <RotateTransform Angle="270" />
                    </TextBlock.LayoutTransform>
                </TextBlock>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>

您可以按照以下方式使用样式:

<DataGridComboBoxColumn Header="Portrait / &#x0a;Landscape" Width="42"
     HeaderStyle="{StaticResource soDataGrid_ColumnHeaderRotateStyle}"
     SelectedItemBinding="{Binding Orientation}"  
     ItemsSource="{Binding Mode=OneWay, 
     Source={StaticResource languageEnum}}" />

我发现这种方法能让你有很多控制权。在长标题文本中使用换行代码会很有帮助。

不幸的是,我发现你需要硬编码旋转文本块的宽度 - 也许有更好的方法可以根据文本内容设置宽度。


1
这种方法允许按预期进行列调整大小行为。+1。 - Commodore63

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接