WPF中心使用LayoutTransform进行缩放

时间:2016-06-28 03:33:04

标签: .net wpf

更新1 我相信我需要根据操纵原点值设置ScrollViewer的垂直和水平偏移量,以使图像保持在“捏”状态。但是,我在如何计算这些值方面遇到了麻烦。

作为更大型应用程序的一部分,我们希望用户能够进行缩放和拖动以平移滚动查看器内的图像。我下面的内容将允许平移和捏缩放。但是,变焦似乎是从左上角开始的,我希望它在“捏”下居中。如何修改此代码才能执行此操作? 我找到了使用RenderTransform完美实现这一功能的示例,但无法弄清楚如何使用LayoutTransforms进行此操作。

这是我的xaml设置:

   <ScrollViewer Name="MainScrollViewer" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"  >
        <Image Name="MainImage" Source="/test.jpg" Stretch="None" IsManipulationEnabled="True">
            <Image.LayoutTransform>
                <ScaleTransform x:Name="ScaleTrans"/>
            </Image.LayoutTransform>
        </Image>
    </ScrollViewer>

这是背后的代码:

Private Sub MainImage_ManipulationStarting(sender As Object, e As ManipulationStartingEventArgs) Handles MainImage.ManipulationStarting
    e.ManipulationContainer = MainScrollViewer
    e.Handled = True
End Sub


Private Sub MainImage_ManipulationDelta(sender As Object, e As ManipulationDeltaEventArgs) Handles MainImage.ManipulationDelta
    Dim delta = e.DeltaManipulation
    Dim element = TryCast(e.Source, FrameworkElement)
    If element IsNot Nothing Then
        'Apply Scale Value
        ScaleTrans.ScaleX *= delta.Scale.X
        ScaleTrans.ScaleY *= delta.Scale.Y

        'Panning
        MainScrollViewer.ScrollToHorizontalOffset(MainScrollViewer.HorizontalOffset + delta.Translation.X * -1)
        MainScrollViewer.ScrollToVerticalOffset(MainScrollViewer.VerticalOffset + delta.Translation.Y * -1)
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

设置变换的中心点。

<ScrollViewer Name="MainScrollViewer" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"  >
    <Image Name="MainImage" Source="/test.jpg" Stretch="None" IsManipulationEnabled="True">
        <Image.LayoutTransform>
            <ScaleTransform x:Name="ScaleTrans" CenterX="0.5" CenterY="0.5" />
        </Image.LayoutTransform>
    </Image>
</ScrollViewer>

如果你需要它相对于夹点的位置,请在后面编码。与xaml版本一样,您可以更改CenterX的{​​{1}}和CenterY属性。但请注意,这两个属性不是点值,而是相对于自身ScaleTransform0.0的值。左上角是1.0 / CenterX = 0.0,而CenterY = 0.0 / CenterX = 1.0位于右下方。你需要自己做一些计算。