我使用这个 StackOverflow答案来旋转 DataGrid,使列标题显示为行标题,而新的 DataGrid 行将显示为列(水平 DataGrid)。
在 DataGrid 的样式中,我有一个 ControlTemplate,它由一个 ScrollContentPresenter 和两个 ScrollBar(垂直和水平)组成。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}" />
此网格的水平滚动按预期工作。但是,垂直滚动仍然会在物理上发生,并且当单元格滚动到屏幕外(或返回屏幕)时,会在第一行单元格上出现一些奇怪的视觉伪影。文物截图在这里。
当我向下滚动时,单元格(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。似乎变换在滚动期间影响了单元格的计算 DisplayHeight,并导致它们在真正离开屏幕之前“消失”。(旁注:逻辑滚动 (CanContentScroll = true) 禁用 DataGridCells 的虚拟化)。
我的目标是通过逻辑滚动或纠正渲染问题(首选)来消除垂直滚动伪影。
编辑:我的问题如下:由于滚动旋转的数据网格,如何消除这些视觉伪影?