【问题标题】:WPF: Change the RotateTransform center before angle animationWPF:在角度动画之前更改 RotateTransform 中心
【发布时间】:2021-02-12 04:02:00
【问题描述】:

我想为我的用户控件旋转动画,该动画将在控件获得键盘焦点时触发。动画应围绕其中心旋转。

问题是,我把加载动画的原中心点设置在控件的左下角。因此,为了纠正这个问题,我将中心设置在触发器IsFocused 上的控件中间。

但我的GetKeyboardFocus 动画保持原来的中心。

触发器是在eventtrigger之后执行的吗?或者我做错了什么。

<UserControl x:Class="testtuile.rectangle"
         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" 
         d:DesignHeight="300" d:DesignWidth="300" Height="150" Width="300" Padding="4" Focusable="True" MouseDown="UserControl_MouseDown" IsTabStop="True">
<UserControl.RenderTransform>
    <RotateTransform Angle="0" CenterX="0" CenterY="150"></RotateTransform>
</UserControl.RenderTransform>
<UserControl.Style>
    <Style>
        <Style.Triggers>
            <Trigger Property="Control.IsFocused" Value="True">
                <Setter Property="Control.BorderBrush" Value="Gold"></Setter>
                <Setter Property="Control.BorderThickness" Value="2"></Setter>
                <Setter Property="Control.RenderTransform">
                    <Setter.Value>
                        <RotateTransform CenterX="150" CenterY="75"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Style>
<UserControl.Triggers>
    <EventTrigger RoutedEvent="Loaded">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                        Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)"
                        From="90" To="0" Duration="0:0:0.8" 
                        AutoReverse="False" 
                    />
                    <DoubleAnimation
                        Storyboard.TargetProperty="Opacity"
                        From="0" Duration="0:0:0.6"
                        AutoReverse="False"
                    />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
    <EventTrigger RoutedEvent="GotKeyboardFocus">
        <EventTrigger.Actions>
            <BeginStoryboard Name="ButtonFocusedAnimation">
                <Storyboard>
                    
                    <DoubleAnimation
                        Storyboard.TargetProperty="(RenderTransform).(RotateTransform.Angle)"
                        From="-2" To="2" Duration="0:0:1" 
                        AutoReverse="True" RepeatBehavior="Forever" 
                    />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
    <EventTrigger RoutedEvent="LostKeyboardFocus">
        <StopStoryboard BeginStoryboardName="ButtonFocusedAnimation" />
    </EventTrigger>
</UserControl.Triggers>

<Grid Background="Aquamarine">


</Grid>

感谢您的帮助。

【问题讨论】:

    标签: c# wpf animation eventtrigger


    【解决方案1】:

    您不必在动画之前更改它。旋转圆中心点集UIElement.RenderTransformOrigin 反对UserControl

    <UserControl RenderTransformOrigin="0.5,0.5" ...>
    

    获取或设置由 RenderTransform 声明的任何可能的渲染变换的中心点,相对于元素的边界

    以后

    RenderTransformOrigin 对 Point 结构值的使用有点不标准,因为 Point 不代表坐标系中的绝对位置。相反,0 到 1 之间的值被解释为每个 x,y 轴中当前元素范围的一个因子。例如,(0.5,0.5) 将导致渲染变换以元素为中心,或者 (1,1) 将渲染变换放置在元素的右下角

    【讨论】:

    • 感谢 dkozl。我会省略你的细节,但你今晚救了我的勇气。因此 +1。
    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2016-07-06
    • 2017-03-27
    • 2010-10-16
    • 1970-01-01
    • 2019-01-16
    • 2018-02-19
    相关资源
    最近更新 更多