【问题标题】:WPF RenderTransform scale questionsWPF RenderTransform 缩放问题
【发布时间】:2013-10-31 11:41:48
【问题描述】:

我试图找到我的问题的答案,但没有成功。没有发现有人试图做类似的事情。

我只是想在 DataGrid 上设置一个默认比例因子(对象无关紧要)并让它手动编辑。现在让我更详细地解释一下。

我有一个滑块,其值范围从 10 到 100,间隔刻度为 10。

<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。

在某些情况下,网格比滚动查看器大,它显示滚动条,这很好,但我想要的是: 绑定完成并完成上漆(生成所有内容)后,我想缩放到允许我查看所有内容的级别。如果由于数据网格太大而无法实现,我需要在 Zoom 10 (10%) 处停止。我需要缩放因子仅在列表内的刻度上停止。

我尝试遍历幻灯片刻度并设置缩放并检查滚动查看器是否仍显示滚动条,但这不起作用滚动查看器总是在一切更改之前显示值。我的意思是,如果网格是 1x1 像素,则滚动查看器滚动 ba 可见是错误的,即使它放大到足以使 1x1 网格达到 1000% 缩放,因此实际显示 1000x1000 像素和滚动条。 onve 代码完成运行我单击消息框滚动条可见性的按钮,我认为它们是真的。

似乎更改滑块值不会立即更新网格的比例变换。

所以简而言之,我只是想要一个适合的比例,并且只发生一次数据网格的每次绑定更新。我也确切地知道每次网格数据源发生变化。

谢谢

编辑数据网格。代码显示了 LayoutTransform 而不是 RenderTransform。我在测试 LayoutTransform 时复制了它,只是想看看是不是这样。无论如何,两者都适用于缩放,但缩放以适应失败

【问题讨论】:

  • 如果我理解正确,我认为您需要使用Measure 方法手动确定最佳比例因子。 Measure 将设置 DesiredSize,您可以通过将其与容器的大小进行比较来确定需要多少缩放才能获得适合的缩放比例。此外,要使其正常工作,您可能需要使用 LayoutTransform。这是有关Measure 方法的信息。 msdn.microsoft.com/en-us/library/…
  • 好吧,我现在肯定会选择LayoutTransformRenderTransform 不会影响 DataGrid 边框,但 LayoutTransform 会。该链接在这种情况下确实有效,因为网格始终具有未确定的宽度,除非它超过容器。但这对于我拥有的其他 2 个控件来说仍然是完美的,它们与这个有问题的控件非常相似,并且缩放将用于图像。谢谢
  • 啊,我不知道DataGrid。真可惜。不过,很高兴它在其他情况下对你有用。

标签: c# wpf zooming scaling


【解决方案1】:

我开始从另一个角度看待问题并尝试得到

scrZoomPanel.ComputedHorizontalScrollBarVisibility

scrZoomPanel.ComputedHorizontalScrollBarVisibility

在更改 DataGrid 之前是原始值以外的任何其他值。

所以我正在寻找一种方法来强制刷新 scrZoomPanel 并发现你有一个功能:

scrZoomPanel.UpdateLayout();

如果我每次都在尝试读取 scrZoomPanel.ComputedHorizontalScrollBarVisibility 之前调用它,那么它最终会返回给我真正的价值。

但我发现每次都需要调用它有点侵入性。想知道是否有办法在 XAML 中而不是后台代码中进行绑定更改强制刷新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多