WPF Storyboard - 相同的触发器,但行为相反

2024-04-02

我有一个 Stackpanel One,其中有一些内容、一个图像和一个默认隐藏的 SubStackpanel。单击图像时,图像应旋转 90 度,并向下滑动 SubStackpanel。 再次单击图像时,图像应旋转回其原始位置,并且 SubStackpanel 应向上滑动到默认隐藏位置。

我几乎成功了,问题是我不知道如何在两个不同的故事板动画上使用相同的触发事件。因此,现在每次单击图像时,只会出现按钮和 SubStackpanel 上的第一个动画。 我尝试过 AutoReverse 属性,但它在动画完成后立即触发。当然,只有当用户第二次单击图像时才会发生这种情况。

我想仅使用标记来实现这一目标。

这是我当前的代码:

<Grid>
        <StackPanel Grid.Row="0" Orientation="Vertical" Background="Beige" >
            <StackPanel.Triggers>
                <EventTrigger SourceName="ImageShowPanelTwo" RoutedEvent="Image.MouseDown">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="SubPanel" Storyboard.TargetProperty="(StackPanel.Height)" From="0" To="66" Duration="0:0:0.5" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger  SourceName="ImageShowPanelTwo" RoutedEvent="Image.MouseDown">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="SubPanel" Storyboard.TargetProperty="(StackPanel.Height)" From="66" To="0" Duration="0:0:0.5" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </StackPanel.Triggers>

            <TextBlock>Panel One</TextBlock>

            <Image Name="ImageShowPanelTwo" Width="26" Height="26" Source="ImageRotate.png" RenderTransformOrigin=".5,.5"  >
                <Image.RenderTransform>
                    <RotateTransform x:Name="AnimatedRotateTransform" Angle="0" />
                </Image.RenderTransform>
                <Image.Triggers>
                    <EventTrigger RoutedEvent="Image.MouseDown">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="AnimatedRotateTransform" 
                                             Storyboard.TargetProperty="Angle" 
                                             By="0"        
                                             To="90" 
                                             Duration="0:0:0.5" 
                                                 AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Image.MouseDown">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="AnimatedRotateTransform" 
                                             Storyboard.TargetProperty="Angle" 
                                             By="90"        
                                             To="0" 
                                             Duration="0:0:0.5" 
                                                 AutoReverse="True"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Image.Triggers>
            </Image>


            <StackPanel Name="SubPanel" Background="LightGreen" Height="66">
                <TextBlock>SubPanel</TextBlock>
                <TextBlock>SubPanel</TextBlock>
            </StackPanel>

        </StackPanel>


    </Grid>

希望你能帮忙:)


Blend for Visual Studio 可以以更好、更简单的方式完成此任务,而无需处理大量代码。

这是执行此操作的步骤列表。

Step 1:同时在 Blend for Visual Studio 和 Visual Studio 中打开项目。

Step 2:在 Blend 中,围绕您希望使用它制作动画的所有元素创建一个新的故事板。 我们将其称为“Storyboard1”。

Step 3:现在,打开我们刚刚创建的故事板,单击“+”旁边的小箭头,然后单击下拉菜单中的“复制”。然后,将创建一个名为“Storyboard1_Copy”的新故事板。

Step 4:将此新故事板重命名为您喜欢的名称,例如“Storyboard1_Rev”。

Step 5: 你现在应该已经猜到了。选择复制的故事板,然后从下拉菜单中单击“反转”。

Step 6:现在您已经准备好了两个故事板:一个用于根据需要对某些元素进行动画处理,另一个用于反转动画顺序。就像从 C# 代码调用故事板一样,您可以从相同的代码调用反向故事板,但要遵守一些条件,检查元素是否已经动画化。为此,我使用一个 bool 变量,每次在一组元素上发生某些动画时,其值都会更改(即,如果元素尚未动画,则为 false,如果已动画,则为 true)。

举例说明:

我将创建一个具有简单布局的应用程序。它在屏幕上有一个按钮、一个图像和一个矩形区域。

这个想法是,每当您单击按钮一次时,图像应该最大化,并且当单击按钮两次时图像应该最小化回到原始大小,依此类推。也就是说,每隔一次单击按钮时就会发生反向动画。以下是一些屏幕截图,显示了它是如何发生的:

您可以看到图像的当前状态显示在按钮中。当图像处于初始小尺寸时,它显示“放大”;当图像最大化时,它显示“缩小”。

最后,这是处理按钮点击的 C# 代码:

    bool flag = false;
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (!flag)
        {
            Button.Content = "Zoom Out";
            Storyboard1.Begin();
            flag = true;
        }
        else
        {
            Button.Content = "Zoom In";
            Storyboard1_Rev.Begin();
            flag = false;
        }
    }

您所要做的就是拥有一个状态标志,该标志显示您希望设置动画的元素的当前状态,并根据标志的值在正向或反向时间轴中为其设置动画。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF Storyboard - 相同的触发器,但行为相反 的相关文章

随机推荐