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

标签 c# wpf xaml

我正在使用 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/

相关文章:

c# - 想要在表格的每一行中显示两个额外的元素,比如 - 'update' 和 'delete' 链接标签

c# - 无法删除字符串中的一组字符

c# - 如何创建随音频变化的显示

c# - 编写 PCI 兼容程序集需要什么?

c# - 按值对 ConcurrentDictionary 进行排序

c# - 从 await 恢复是如何实现的?

c# - DataTrigger 绑定(bind)到属性

unit-testing - 为 XAML 创建自定义代码分析规则

wpf - 在依赖属性 (XAML) 中使用大值

wpf - 将 DynamicResource 绑定(bind)到 BasedOn 样式