【问题标题】:Can't find a way to animate a RotateTransform in a ControlTemplate找不到在 ControlTemplate 中为 RotateTransform 设置动画的方法
【发布时间】:2013-06-24 09:35:44
【问题描述】:

我正在尝试为 XAML 中的按钮编写 ControlTemplate。在 Triggers 集合中,我想使用 RotateTransform 旋转按钮的一个元素,稍后将获得动画效果(为简单起见,关闭动画)。为此,我需要参考附加到按钮元素的旋转变换的角度属性。这就是问题所在:我似乎找不到引用它的方法。代码如下:

<ControlTemplate x:Key="myButtonTemplate"
                 TargetType="Button">
    <Grid>
        <Ellipse x:Name="OuterCircle"
                 RenderTransformOrigin="0.5, 0.5">
            <Ellipse.Fill>
                <RadialGradientBrush Center="0.7,0.7">
                    <GradientStop Offset="0.9" Color="DarkBlue"/>
                    <GradientStop Offset="0.2" Color="White"/>
                </RadialGradientBrush>
            </Ellipse.Fill>
            <Ellipse.RenderTransform>
                <RotateTransform x:Name="myTransform" Angle="0"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Ellipse x:Name="InnerCircle"
                 RenderTransformOrigin="0.5, 0.5"
                 Stroke="DarkBlue"
                 >
            <Ellipse.Fill>
                <RadialGradientBrush Center="0.35,0.35"
                                     RadiusX="0.7"
                                     RadiusY="0.7">
                    <GradientStop Offset="0.05" Color="#70B0FF"/>
                    <GradientStop Offset="0.9" Color="DarkBlue"/>
                </RadialGradientBrush>
            </Ellipse.Fill>
            <Ellipse.RenderTransform>
                <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
            </Ellipse.RenderTransform>
        </Ellipse>
        <Viewbox Margin="10">
            <ContentPresenter Margin="{TemplateBinding Padding}"/>
        </Viewbox>
    </Grid>

    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="myTransform" Property="Angle" Value="90"/>
        </Trigger>
    </ControlTemplate.Triggers>

</ControlTemplate>

我试图通过 x:Name="myTransform" 为 RotateTransform 命名,并将其用作 Setter 中的 TargetName。这没有用。尝试过的其他事情是“打点”,例如TargetName="OuterCircle.RenderTransofrm.RotateTransform"。也没有快乐。

看起来这应该很容易,而且很可能是。有人能指出我正确的方向吗?

谢谢,--克里斯。

【问题讨论】:

    标签: wpf xaml controltemplate setter


    【解决方案1】:

    其实设置Storyboard.TargetName就可以访问myTransform

    <ControlTemplate.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="myTransform"
                                     Storyboard.TargetProperty="Angle"
                                     To="90" Duration="0:0:0.1"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="myTransform"
                                     Storyboard.TargetProperty="Angle"
                                     To="0" Duration="0:0:0.1"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </ControlTemplate.Triggers>
    

    【讨论】:

    • 谢谢,Clemens,您的解决方案有效!只是为了增强我的个人学习经验:这将如何与属性触发器一起使用,而您不能使用 Storyboard.TargetName?换句话说:有没有办法使原始示例工作?这样做的魅力在于您只需要在IsMouseOver=True 上使用一个触发器,而不是两个 EventTrigger。
    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多