[英]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.