简体   繁体   English

在WPF中有条件地为情节提要动画吗?

[英]Conditionally animate storyboard in WPF?

thanks for taking a look. 谢谢参观。 I'm trying to make a button in WPF shake when pressed, if a checkbox is checked somewhere else. 如果尝试在其他位置选中复选框,则试图在WPF摇动中创建一个按钮。 I tried to do this solely in XAML but couldn't figure out how to check both for click as a trigger and the checkbox. 我尝试仅在XAML中执行此操作,但无法弄清楚如何同时检查单击作为触发器和复选框。 Here's my XAML code: 这是我的XAML代码:

<Style TargetType="{x:Type Button}">
 <Setter Property="RenderTransformOrigin"
         Value="0.5 0.5" />
 <Setter Property="RenderTransform">
   <Setter.Value>
     <RotateTransform />
   </Setter.Value>
 </Setter>

 <Style.Triggers>

   <MultiTrigger>

     <MultiTrigger.Conditions>
       <Condition Property='IsPressed'
                  Value='True' />
     </MultiTrigger.Conditions>

     <MultiTrigger.EnterActions>
       <BeginStoryboard>
         <Storyboard TargetProperty="RenderTransform.Angle">
           <DoubleAnimation From="0"
                            To="5"
                            Duration="0:0:0.05"
                            AutoReverse="True"
                            FillBehavior="Stop" />
           <DoubleAnimation BeginTime="0:0:0.05"
                            From="5"
                            To="-5"
                            Duration="0:0:0.1"
                            AutoReverse="True"
                            FillBehavior="Stop" />
           <DoubleAnimation BeginTime="0:0:0.2"
                            From="-5"
                            To="0"
                            Duration="0:0:0.1"
                            AutoReverse="False"
                            FillBehavior="Stop" />
         </Storyboard>
       </BeginStoryboard>
     </MultiTrigger.EnterActions>

   </MultiTrigger>
 </Style.Triggers>

This makes buttons always shake when pressed. 这使按钮在按下时总是摇晃。 To get it to work conditionally I figured I should implement this in the codebehind. 为了使它有条件地工作,我认为我应该在后面的代码中实现它。 Once I get the animation working, it should be as simple as adding an if statement, I think. 我认为动画一旦开始工作,就应该像添加if语句一样简单。

MainWindow : Window

{

    private Storyboard myStoryboard;

    public MainWindow()

    {

        InitializeComponent();

        DoubleAnimation myDoubleAnimation = new DoubleAnimation();

        myDoubleAnimation.From = 0.0;
        myDoubleAnimation.To = 20.0;

        myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));

        myDoubleAnimation.AutoReverse = true;

        myStoryboard = new Storyboard();

        myStoryboard.Children.Add(myDoubleAnimation);
        Storyboard.SetTargetName(myDoubleAnimation, HelpButton.Name);
        Storyboard.SetTargetProperty(myDoubleAnimation, new 
        PropertyPath(RotateTransform.AngleProperty));
        HelpButton.Click += ShakeObject;

    }

private void ShakeObject(object sender, RoutedEventArgs e)
    {
        myStoryboard.Begin(this);
    }
}

I'd expect this code to rotate my button named 'HelpButton' (in XAML) by 20 degrees then back, but no such luck. 我希望这段代码可以将我的名为“ HelpButton”的按钮(在XAML中)旋转20度,然后向后旋转,但是没有这种运气。

I can execute a single RotateTransform with .BeginAnimation(RotateTransform.AngleProperty, myDoubleAnimation); 我可以使用.BeginAnimation(RotateTransform.AngleProperty,myDoubleAnimation)执行单个RotateTransform; but I want to do several rotations in succession (to simulate shaking). 但我想连续进行几次旋转(以模拟晃动)。

Any help is appreciated! 任何帮助表示赞赏! Thanks. 谢谢。

我发现的一种解决方案是,当IsChecked触发我的复选框时,将XAML样式应用于按钮,如果未选中,则将其删除。

You need to add the condition on the checkbox and change the MultiTringger in MultiDataTrigger. 您需要在复选框上添加条件并在MultiDataTrigger中更改MultiTringger。 Here is the code 这是代码

<Style TargetType="{x:Type Button}">
            <Setter Property="RenderTransformOrigin" Value="0.5 0.5" />
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <RotateTransform />
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=btn , Path=IsPressed}" Value="True" />
                        <Condition Binding="{Binding ElementName=chk , Path=IsChecked}" Value="True" />
                    </MultiDataTrigger.Conditions>

                    <MultiDataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard TargetProperty="RenderTransform.Angle">
                                <DoubleAnimation From="0"
                        To="5"
                        Duration="0:0:0.05"
                        AutoReverse="True"
                        FillBehavior="Stop" />
                                <DoubleAnimation BeginTime="0:0:0.05"
                        From="5"
                        To="-5"
                        Duration="0:0:0.1"
                        AutoReverse="True"
                        FillBehavior="Stop" />
                                <DoubleAnimation BeginTime="0:0:0.2"
                        From="-5"
                        To="0"
                        Duration="0:0:0.1"
                        AutoReverse="False"
                        FillBehavior="Stop" />
                            </Storyboard>
                        </BeginStoryboard>
                    </MultiDataTrigger.EnterActions>

                </MultiDataTrigger>
            </Style.Triggers>
        </Style>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM