gpt4 book ai didi

c# - 如何使用 ScaleTransform 缩放到任意中心点?

转载 作者:行者123 更新时间:2023-11-30 17:48:49 25 4
gpt4 key购买 nike

如果您尝试以下 XAML 代码,您会注意到一些奇怪的行为。

<Canvas Width="300" Height="300">
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="100" Height="100"
Stroke="Blue" StrokeThickness="1"/>
<Canvas.RenderTransform>
<ScaleTransform CenterX="50" CenterY="50" ScaleX="2" ScaleY="2"/>
</Canvas.RenderTransform>
</Canvas>

蓝色矩形的左上角位于 Canvas 上的 50, 50 处。同样,ScaleTransform 的中心被指定为 50, 50。但是,您会注意到生成的缩放 Canvas 并不像我预期的那样将矩形的左上角置于中心。我的问题是,为什么不呢?如果这是 ScaleTransform 的预期行为,那有什么意义呢?

更新

这是我认为 ScaleTransform 正在做的事情:

enter image description here

Tx为平移值,Cx为原始中心,Sx为缩放因子。如您所见,结果应平移矩形“选择区域”以匹配视口(viewport)。除非它没有。

最佳答案

我刚刚尝试了这个 XAML,它确实像我期望的那样工作 ScaleTransform 工作。

设置缩放变换的“中心”属性并不是说:“把这个点放在我的控件的中心”。它只是说“缩放就好像这是中心”。在旋转变换(使用类似的概念)中更容易看到。

如果您使用 RotateTransform 设置相同的 Canvas ,并将中心设置为 (0, 0),则整个 Canvas 将围绕该点旋转。如果设置为(50, 50), Canvas 围绕矩形的左上角等旋转。

这也不会将矩形移动到 Canvas 的中心,它只是应用“from”变换的点。所以在缩放变换中,如果我的中心是 (0, 0),那么所有缩放都发生在底部和右侧。放在 (50, 50) 处,它在顶部和左侧变大了一点,但大部分仍然在底部和右侧。将它放在 (150, 150) 处,所有方向均等展开。

更新

我不确定反射(reflect)的实现,但这是另一种思考方式。 ScaleTransform 旨在简单地缩放控件。缩放不应涉及相对于彼此移动子元素(即平移),此运动对于获得您描述的行为是必要的。 “中心”变量只是转换的中心,它们不会影响元素相对于父元素的位置(尤其是在 Canvas 中,这些值是硬编码的。)

另外,所有的变换都是“渲染”变换,这意味着它只影响显示,底层控制保持不变。任何缩放操作都不能使位于父对象左上角的对象突然出现在中心。

更新 2我相信我看到最后的检查在做什么 :)。

要进行“居中”缩放变换,您需要调整坐标空间。矩阵 (IIRC) 中的缩放操作始终从“0,0”开始应用。根据MSDN ,“偏移量”属性:

The OffsetX property is so named because it specifies the amount to translate the coordinate space along the x-axis.

这显然不会平移任何控件,它只是调整变换的坐标空间。

更新 3再试一次...

我同意更改缩放中心会导致缩放不均匀,我什至可以想象左上角似乎位于缩放 Canvas 中间的场景。为此,我会尝试将中心放在另一个角落(250,250)。这将需要大量的反复试验才能找到您需要的确切点和比例因子。

话虽这么说,问题是问为什么发布的代码没有产生这个结果。我相信,如果您考虑“从中心缩放”的实际结果,很明显,象限 II 的任何缩放都不会导致象限 2 的点移近原点,它总是会移动更远(从我上面讨论的)。

澄清一下,我将“原点”放在 Canvas 的中心。

希望这是有道理的。如果我能澄清任何事情,请告诉我!

关于c# - 如何使用 ScaleTransform 缩放到任意中心点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22407993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com