我正在写一个标签制作程序。在这个程序中,我有一个画布,中间有一个白色矩形,有多个对象,用户可以在其上调整大小,拖动等。我还可以选择让用户缩放画布,我通过ScaleTransform
使用LayoutTransform
来完成。我想拥有它,以便当用户放大时,画布放大中心,而不是相对于右上角。
这是一个示范:
目前,画布放大如下:
我需要它像这样缩放:
如何在缩放时不重新定位画布中的元素来完成此任务?
注意:我使用LayoutTransform,因为我必须将其嵌入ScrollViewer
。 RenderTransform
实现了这一点,但是当画布元素超出可见画布边界时,不允许用户滚动。
答案 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>