Я использовал этот ответ StackOverflow, чтобы повернуть DataGrid таким образом, чтобы заголовки столбцов отображались как заголовки строк, а новый DataGrid строки будут отображаться как столбцы (горизонтальная DataGrid).
В стиле DataGrid у меня есть ControlTemplate, который состоит из ScrollContentPresenter и двух полос прокрутки (вертикальной и горизонтальной). CanContentScroll имеет значение true для ScrollContentPresenter, поэтому ячейки будут прокручиваться логически, а не физически. Выдержка из этого 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).
Моя цель — устранить артефакты вертикальной прокрутки либо путем логической прокрутки, либо путем исправления проблем с рендерингом (предпочтительно).
Изменить. Мой вопрос заключается в следующем: как я могу устранить эти визуальные артефакты из-за прокрутки повернутой сетки данных?