私は自分の問題に対する答えを見つけようとしていますが、成功していません。似たようなことをしようとしている人は見つかりませんでした。
私は単純に、DataGrid (オブジェクトは関係ありません) にデフォルトの倍率を設定し、手動で編集できるようにしようとしています。では、詳しく説明しましょう。
値の範囲が 10 から 100 で、間隔の目盛りが 10 の Slider があります。
<Slider Name="sldZoom"
IsSnapToTickEnabled="True"
Height="180"
Orientation="Vertical"
TickPlacement="Both"
Minimum="10"
Maximum="100"
Ticks="10, 20, 30, 40, 50, 60, 70, 80, 90, 100"
Value="10" HorizontalAlignment="Center" />
次に、フォーマットの目的で高さと幅を修正したScrollViewerがあります
<ScrollViewer Name="scrZoomPanel"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Height="500
Width="750"
Background="White">
そして最後に、スクロールビューアにランダムな列と行数を持つDataGridがあります
<DataGrid Name="grdArrangement"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalAlignment="Top"
ItemsSource="{Binding Path=ListData}"
IsHitTestVisible="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserSortColumns="False"
HeadersVisibility="None"
AutoGenerateColumns="True"
GridLinesVisibility="None"
SelectionMode="Single"
AutoGeneratingColumn="grdArrangement_AutoGeneratingColumn"
AutoGeneratedColumns="grdArrangement_AutoGeneratedColumns"
Background="White" >
<DataGrid.RenderTransform>
<ScaleTransform
ScaleX="{Binding ElementName=sldZoom, Path=Value, Converter={StaticResource ZoomRatio}}"
ScaleY="{Binding ElementName=sldZoom, Path=Value, Converter={StaticResource ZoomRatio}}" />
</DataGrid.RenderTransform>
</DataGrid>
2 つの自動生成イベントは、データソースが変更されるたびにグリッドに異なるセル スタイルが割り当てられるためです。
したがって、データグリッドは異なる量の行と列を取得でき、ズーム値 100 ではスケールは 1 です。ズーム値 10 ではスケールは 0.1 です。
場合によっては、グリッドがスクロールビューアーよりも大きくなり、スクロールバーが表示されますが、それは問題ありませんが、バインディングが完了し、onpaint が完了した (すべてが生成された) 後、すべてを表示できるレベルにズームしたいと考えています。データグリッドが大きすぎるために不可能な場合は、ズーム 10 (10%) で停止する必要があります。リスト内にある目盛りでのみズーム倍率を停止する必要があります。
スライドの目盛りを繰り返してズームを設定し、スクロールビューアーにスクロールバーがまだ表示されているかどうかを確認してみましたが、スクロールビューアーはすべてが変更される前に常に値を表示します。つまり、グリッドが 1x1 ピクセルの場合、1x1 グリッドが 1000% ズームになるのに十分ズームインしたとしても、スクロール ビューアのスクロール ba は false であり、実際には 1000x1000 ピクセルとスクロールバーが表示されます。コードの実行が完了すると、メッセージボックスのスクロールバーの可視性を示すボタンをクリックすると、それらが true と表示されます。
スライダーの値を変更しても、グリッドのスケール変換がすぐに更新されないようです。
つまり、要するに、Scale To Fit が必要であり、それはデータグリッドのバインド更新ごとに 1 回だけ発生します。また、グリッド データソースが変更されるたびに正確に把握しています。
ありがとうございました
編集されたデータグリッド。コードは、RenderTransform ではなく、LayoutTransform を示していました。代わりに LayoutTransform をテストしているときにコピーして、それがそれであるかどうかを確認しました。とにかく、両方ともズームで動作しますが、ズームに合わせて失敗します