相对于中心而不是左上角缩放WPF画布

时间:2014-10-09 15:35:20

标签: c# wpf canvas scaletransform

我正在写一个标签制作程序。在这个程序中,我有一个画布,中间有一个白色矩形,有多个对象,用户可以在其上调整大小,拖动等。我还可以选择让用户缩放画布,我通过ScaleTransform使用LayoutTransform来完成。我想拥有它,以便当用户放大时,画布放大中心,而不是相对于右上角。

这是一个示范:

目前,画布放大如下:

enter image description here

我需要它像这样缩放:

enter image description here

如何在缩放时不重新定位画布中的元素来完成此任务?

注意:我使用LayoutTransform,因为我必须将其嵌入ScrollViewerRenderTransform实现了这一点,但是当画布元素超出可见画布边界时,不允许用户滚动。

2 个答案:

答案 0 :(得分:0)

您应该能够通过使用围绕缩放组合两个平移的变换来完成与RenderTransformOrigin相同的操作。例如。使用TransformGroup,或组合MatrixTransform的矩阵。

具体来说:通过使用-X和-Y的平移偏移将中心点(X,Y)转换为(0,0),执行缩放变换,然后将(0,0)转换回原始点( X,Y)使用X和Y的平移偏移。

如果没有特定的代码示例,我很难确定,但我有一种模糊的感觉,应该可以使用RenderTransform,也许应用的方式与您不同(例如将新容器添加到层次结构并将其应用于该层次结构。但假设RenderTransform只是不起作用,上面应该。

答案 1 :(得分:0)

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="600">
    <Grid>
        <ScrollViewer>
            <Border>
                <Border.LayoutTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="2.0" ScaleY="2.0"/>
                    </TransformGroup>
                </Border.LayoutTransform>
                <Canvas Background="Red" Width="500" Height="500" VerticalAlignment="Center" HorizontalAlignment="Center">
                    <Canvas.RenderTransform>
                        <TransformGroup>
                            <TranslateTransform X="0" Y="-100"/>
                        </TransformGroup>
                    </Canvas.RenderTransform>
                    <Rectangle Canvas.Left="200" Canvas.Top="200" Width="100" Height="100" Fill="Yellow"/>
                </Canvas>
            </Border>
        </ScrollViewer>
    </Grid>
</Window>