我使用this StackOverflow回答来旋转DataGrid,使列标题显示为行标题,新的DataGrid行显示为列(水平DataGrid)。
在DataGrid的样式中,我有一个ControlTemplate,它包含一个ScrollContentPresenter和两个ScrollBars(垂直和水平)。对于ScrollContentPresenter,CanContentScroll设置为“true”,以便单元格将按逻辑滚动而不是物理滚动。此ControlTemplate的摘录如下所示:
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
CanContentScroll="{TemplateBinding CanContentScroll}"
CanHorizontallyScroll="False"
Grid.ColumnSpan="2"
CanVerticallyScroll="False"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
Grid.Row="1" />
<ScrollBar x:Name="PART_VerticalScrollBar"
Grid.Column="2"
Grid.RowSpan="3"
Maximum="{TemplateBinding ScrollableHeight}"
Orientation="Vertical"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportHeight}" />
[... some code omitted ...]
<ScrollBar x:Name="PART_HorizontalScrollBar"
Grid.Column="1"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize="{TemplateBinding ViewportWidth}" />
此网格的水平滚动按预期工作。然而,垂直滚动仍然是物理上发生的,并且当它们在屏幕外(或在屏幕上)滚动时,在顶行的单元格上发生一些奇怪的视觉伪像。 Screenshots of the artifacts here。
当我向下滚动时,当单元格的顶部移动到屏幕外时,单元格的内容(TextBlock)会消失。当我继续在单元格中垂直滚动时,背景颜色会“水平擦拭”。
以下是我正在应用于网格的转换:
应用于DataGridCells的样式:
<TransformGroup>
<RotateTransform Angle="-90" />
<ScaleTransform ScaleX="1" ScaleY="-1" />
</TransformGroup>
样式应用于列标题:
<TransformGroup>
<RotateTransform Angle="90" />
<MatrixTransform Matrix="-1, 0, 0, 1, 0, 0" />
</TransformGroup>
应用于DataGrid的样式:
<TransformGroup>
<RotateTransform Angle="90" />
<MatrixTransform Matrix="-1, 0, 0, 1, 0, 0" />
</TransformGroup>
有所有LayoutTransforms,而不是RenderTransforms。看起来Transforms正在影响滚动期间单元格的计算DisplayHeight并导致它们在真正离屏之前“消失”。 (旁注:逻辑滚动(CanContentScroll = true)禁用DataGridCells的虚拟化。)
我的目标是通过逻辑滚动或纠正渲染问题来消除垂直滚动工件(首选)。
编辑:我的问题如下:如何通过滚动旋转的数据网格消除这些视觉瑕疵?