gpt4 book ai didi

c# - 执行 RenderTransform(缩放和平移)后如何获得 UIElement 的新位置和大小?

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

我正在使用 RenderTransform 对图像执行缩放、平移和旋转。转换不是使用鼠标事件完成的,相反,用户将单击一个按钮,然后图像将按固定值缩放/平移/旋转。

我的问题是每次执行缩放、平移或旋转时我都想确定图像的新位置/大小。所以我在代码隐藏中添加了 Changed 事件。问题是如何获得新的位置/大小?

请看看我到目前为止做了什么:

XAML:

<Border x:Name="mainImageBorderCtrl" ClipToBounds="True">
<Grid x:Name="imageGridCtrl">
<Grid.RenderTransform>
<TranslateTransform Changed="TranslateTransform_Changed"/>
</Grid.RenderTransform>
<Image x:Name="mainImageCtrl" RenderTransformOrigin="0.5, 0.5" Source="{Binding Image}">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform Changed="ScaleTransform_Changed"/>
<RotateTransform />
</TransformGroup>
</Image.RenderTransform>
</Image>
</Grid>
</Border>

请注意,我将 TranslateTransform 与 ScaleTransform 和 RotateTransform 分开,这样方向就不会受到影响。

以下是 2 个更改的事件。在这里,我希望每次发生缩放或平移时都能获得新的位置/大小。但边界值不会改变。

代码隐藏

private Rect bounds;

private void TranslateTransform_Changed(object sender, EventArgs e)
{
bounds = imageGridCtrl.TransformToAncestor(mainImageBorderCtrl).TransformBounds(new Rect(imageGridCtrl.RenderSize));
}

private void ScaleTransform_Changed(object sender, EventArgs e)
{
bounds = imageGridCtrl.TransformToAncestor(mainImageBorderCtrl).TransformBounds(new Rect(imageGridCtrl.RenderSize));
}

编辑:我的目标是限制 Border 控件内图像的平移(平移),这就是为什么我需要在每次转换后获取图像的边界,无论转换是什么, 这样我就可以检查图像的边界是否超出了边界。

最佳答案

TranslateTransform 正在生成正确的边界。但是,对于 ScaleTransform,您正在控制 imageGridCtrl 上,但转换是作为控件 mainImageCtrl 的子级添加的。

因此,您应该使用mainImageCtrl 代替imageGridCtrl 以获得正确的边界:

bounds = mainImageCtrl.TransformToAncestor(mainImageBorderCtrl)
.TransformBounds(new Rect(mainImageCtrl.RenderSize));

关于c# - 执行 RenderTransform(缩放和平移)后如何获得 UIElement 的新位置和大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22281478/

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