0

私は自分の問題に対する答えを見つけようとしていますが、成功していません。似たようなことをしようとしている人は見つかりませんでした。

私は単純に、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 をテストしているときにコピーして、それがそれであるかどうかを確認しました。とにかく、両方ともズームで動作しますが、ズームに合わせて失敗します

4

1 に答える 1