如何在我的控件旋转已更改时收到通知

时间:2015-04-13 07:41:29

标签: wpf user-controls rotation

UserControl课程为我提供SizeChanged等活动。因此,当大小改变时,我可以对我的控制执行任何操作:

XAML:

<UserControl x:Class="TestControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Loaded="UserControl_Loaded" SizeChanged="UserControl_SizeChanged">

背后的代码:

    private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
    {
      // do anything
    }

现在我想知道我的控制旋转何时发生变化。但是,UserControl类不向我提供RotationChanged-Event。

我想要跟踪旋转的原因是我在用户控件中有一些我想要向后旋转的元素,因此它们始终与应用程序的水平轴/方向对齐。 (其他父元素不会被轮换,所以我不必关心那些。)

这是一张图片,说明了我想要存档的内容: sample

黑框是用户控件,而红框是我的用户控件中的UIElement。默认状态位于顶部。 当用户旋转我的控件(底部样本)时,我想在我的控件中反向旋转元素。如果没有RotationChanged事件,我还能怎么办?

修改 对于Sheridan的给定解决方案,我想提及事件必须在我的用户控件的Loaded事件中订阅。在Changed事件中,我可以简单地转换为RotateTransform并检查null。在初始旋转时,我必须尝试在Loaded事件中将this.RenderTransform强制转换为RotateTransformTransformGroup(我可以循环的子项)。通过这种方式,我得到了我的角度。

但是,如果你试图像我一样存档,那么还有一个问题,因为设计人员会覆盖你的RenderTransform节点,因此RenderTransform.Changed事件将会丢失。我在StackOverflow上将它作为自己的问题分开:Subscription to RenderTransform.Changed will be lost when it does not fulfill the XAML pattern of the designer on initial time

1 个答案:

答案 0 :(得分:1)

RotationChanged类上没有UserControl事件,因为该类不执行旋转。而是在WPF中,轮换由RotationTransform Class执行。您可以在该课程中找到Freezable.Changed event

RotationTransform transform = new RotationTransform();
transform.Changed += OnRotationChanged;

...

public void OnRotationChanged(object sender, EventArgs e)
{
    ...
}