この StackOverflowの回答を使用して、列ヘッダーが行ヘッダーとして表示され、新しい DataGrid 行が列 (水平 DataGrid) として表示されるように DataGrid を回転させました。
DataGrid のスタイルには、ScrollContentPresenter と 2 つの ScrollBar (垂直と水平) で構成される ControlTemplate があります。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>
RenderTransform ではなく、すべて LayoutTransform があります。Transforms は、スクロール中にセルの計算された DisplayHeight に影響を与え、実際に画面外になる前に「消える」原因になっているようです。(補足: 論理スクロール (CanContentScroll = true) は、DataGridCells の仮想化を無効にします)。
私の目標は、論理的にスクロールするか、レンダリングの問題を修正することによって、垂直スクロールのアーティファクトを排除することです (推奨)。
編集:私の質問は次のとおりです:回転したデータグリッドのスクロールによるこれらの視覚的なアーティファクトをどのように排除できますか?