在执行RenderTransform(Scale& Translate)后,如何获得UIElement的新位置和大小?

时间:2014-03-09 11:15:49

标签: 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控件中Image的转换(平移),这就是为什么我需要在每次转换后获取Image的边界,无论转换是什么,以便我可以检查图像的边界是否超过边界。

2 个答案:

答案 0 :(得分:3)

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

所以你应该使用mainImageCtrl代替imageGridCtrl来获得正确的界限

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

答案 1 :(得分:1)

变换事件发生得太早。您应该连接到图像控件的LayoutUpdated事件。然后尝试:

mainImageCtrl.TransformToAncestor(mainImageBorderCtrl)
    .TransformBounds(new Rect(mainImageCtrl.RenderSize))