спасибо, что посмотрели. Я пытаюсь заставить кнопку в WPF дрожать при нажатии, если где-то еще установлен флажок. Я пытался сделать это исключительно в XAML, но не мог понять, как проверить и щелчок как триггер, и флажок. Вот мой код 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>
Это заставляет кнопки всегда дрожать при нажатии. Чтобы заставить его работать условно, я решил, что должен реализовать это в коде. Я думаю, что после того, как анимация заработает, все должно быть так же просто, как добавить оператор 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);
}
}
Я ожидал, что этот код повернет мою кнопку с именем HelpButton (в XAML) на 20 градусов, а затем назад, но не повезло.
Я могу выполнить один RotateTransform с помощью .BeginAnimation (RotateTransform.AngleProperty, myDoubleAnimation); но я хочу сделать несколько вращений подряд (чтобы имитировать тряску).
Любая помощь приветствуется! Спасибо.
Поверните назад и вперед пару раз. Эта анимация выглядит действительно круто, но я был бы более чем счастлив, если бы просто повернулся на +10 градусов, затем на -10 градусов, а затем на 0.
Эффект 2d тряска может быть достигнут с помощью одиночной анимации с добавленным функция ослабления.
Спасибо, посмотрю!





Одно решение, которое я нашел, - применить мой стиль XAML к моей кнопке, когда IsChecked срабатывает для моего флажка, а затем удалить стиль, если он не установлен.
Вам нужно добавить условие в чекбокс и изменить MultiTringger в MultiDataTrigger. Вот код
<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>
Выглядит отлично, спасибо! Где вы рекомендуете разместить этот стиль, если я хочу использовать его на кнопках в разных пользовательских элементах управления? Если я помещу его в App.xaml, это не сработает, я думаю, потому что флажок находится в своем собственном представлении. (Я выполнял самостоятельную привязку к IsPressed) Есть ли способ ссылаться на эту конкретную кнопку на уровне App.xaml?
Я собираюсь изучить модели просмотра, я думаю, что это может предложить какое-то решение
После прочтения руководства я смог это сделать, спасибо! Это был такой: codeproject.com/Articles/1112919/MVVM-for-beginners