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

3
我正在编写一个标签制作程序。在这个程序中,我有一个带有白色矩形的画布位于中心,用户可以在其上面调整大小、拖动等多个对象。我还为用户提供了缩放画布的选项,我使用LayoutTransform通过ScaleTransform实现。我希望当用户放大时,画布能够以中心为基准进行放大,而不是相对于右上角进行放大。
以下是演示:
目前,画布的缩放效果如下图所示: enter image description here 我需要它的缩放效果如下图所示: enter image description here 我该如何完成这个任务,而不必在缩放时重新定位画布中的元素?
注意:由于必须将此嵌入到ScrollViewer中,所以我正在使用LayoutTransform。虽然RenderTransform可以实现这一点,但当画布元素超出可见画布范围时,它不允许用户滚动。

你尝试过将 RenderTransformOrigin(用于你的 Canvas)设置为 0.5,0.5 吗?(当然这意味着你的 Canvas 使用了 RenderTransform,而不是 LayoutTransform)。 - King King
@KingKing 我正在使用LayoutTransform,因为我必须将其嵌入到“ScrollViewer”中。 - user3141031
请看这个链接是否有帮助:如何在缩放时自动将内容居中显示在ScrollViewer中 - pushpraj
2个回答

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>

0

您应该能够通过使用将两个平移组合在缩放周围的变换来实现与RenderTransformOrigin相同的效果。例如,使用TransformGroup或将矩阵组合为MatrixTransform。

具体而言:使用-X和-Y的平移偏移量将中心点(X,Y)转换为(0,0),执行比例变换,然后使用X和Y的平移偏移量将(0,0)转换回原始点(X,Y)。

如果没有具体的代码示例,很难确定是否可以使用RenderTransform,也许需要以不同于您所期望的方式应用它(例如,向层次结构添加新容器并将其应用于该容器)。但是,假设RenderTransform无法正常工作,则上述方法应该可行。


当你说“翻译中心点”时,你能具体说明一下吗? - user3141031
抱歉我的表述有些含糊。我的意思是创建一个转换,将中心点转换到所需位置。当然,这样的转换也会转换所有其他点……只是以特定点为基础思考可以清楚地了解应该是什么样的转换(或者至少应该让它变得清晰:))。TranslateTransform 只是一个 X 和 Y 偏移量,因此要将给定点 (X1,Y1) 转换为 (0,0),只需定义一个偏移量分别为 -X1 和 -Y1 的转换即可。然后所有点都会按该量移动,其中点 (X1, Y1) 移动到 (0,0)。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接