3

この 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 の仮想化を無効にします)。

私の目標は、論理的にスクロールするか、レンダリングの問題を修正することによって、垂直スクロールのアーティファクトを排除することです (推奨)。

編集:私の質問は次のとおりです:回転したデータグリッドのスクロールによるこれらの視覚的なアーティファクトをどのように排除できますか?

4

0 に答える 0