我正在使用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的边界,无论转换是什么,以便我可以检查图像的边界是否超过边界。
答案 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))