Условно анимировать раскадровку в WPF?

спасибо, что посмотрели. Я пытаюсь заставить кнопку в 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); но я хочу сделать несколько вращений подряд (чтобы имитировать тряску).

Любая помощь приветствуется! Спасибо.

Встряхивание?
Sinatr 19.07.2018 17:07

Поверните назад и вперед пару раз. Эта анимация выглядит действительно круто, но я был бы более чем счастлив, если бы просто повернулся на +10 градусов, затем на -10 градусов, а затем на 0.

B-H 19.07.2018 17:09

Эффект 2d тряска может быть достигнут с помощью одиночной анимации с добавленным функция ослабления.

Sinatr 19.07.2018 17:25

Спасибо, посмотрю!

B-H 19.07.2018 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
620
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Одно решение, которое я нашел, - применить мой стиль 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?

B-H 20.07.2018 12:19

Я собираюсь изучить модели просмотра, я думаю, что это может предложить какое-то решение

B-H 20.07.2018 12:22

После прочтения руководства я смог это сделать, спасибо! Это был такой: codeproject.com/Articles/1112919/MVVM-for-beginners

B-H 20.07.2018 19:16

Другие вопросы по теме