Синхронизация WPF ColorAnimation между несколькими элементами управления - PullRequest
8 голосов
/ 18 января 2011

У меня есть несколько тумблерных кнопок, которые я хочу пульсировать в унисон, когда нажата.

Я определил стиль с триггером, который запускает анимацию свечения, и это прекрасно работает, за исключением того факта, что каждая кнопка пульсирует асинхронно от других.

Как я могу заставить каждую кнопку синхронизировать свой импульс с другими?

Вот стиль:

<Storyboard x:Key="pulseStory">
    <ColorAnimation                                                                    
        Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)"
                    From="Red"
                    To="Transparent"
                    Duration="0:0:1" />
</Storyboard>

<Style x:Key="pulseButton" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource pulseStory}"/>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

Ура!

Ответы [ 2 ]

4 голосов
/ 19 января 2011

ОК ... Я попробую ...

Инфраструктура WPF не имеет никаких средств для синхронизации анимаций, которые запускаются одновременно, поэтому вам придется прийтис другим методом.Одна идея приходит на ум ...

Анимируйте некоторое свойство Color скрытого элемента пользовательского интерфейса в вашей раскадровке, затем используйте привязку пользовательского интерфейса (т.е. привязки ElementName), чтобы подключиться к цвету каждой из ваших кнопок к этому скрытому пользовательскому интерфейсу.элемент.

1 голос
/ 19 января 2011

На самом деле вы должны делать это через ресурс, по крайней мере, использование скрытого элемента управления - это слишком большой взлом для меня лично.

Что нужно выполнить, чтобы он работал:

  1. Свойство, к которому вы привязываете, должно быть DependencyProperty, следовательно, ваш обертывающий объект должен быть DependencyObject.
  2. Вы должны ссылаться на объект как статический ресурс (в отличие отдинамический ресурс) вроде этого:
<DoubleAnimation
    Storyboard.Target="{StaticResource AnimationValue}"
    Storyboard.TargetProperty="(local:WrappedValue.Value)"
    To="0" Duration="0:0:1"/>

Ну, по общему признанию, это немного глупо иметь класс Wrapper для этого, но он чище, чем полный контроль (если вы хотите использовать элементы управлениявы можете использовать некоторые неиспользуемые свойства Tag, например, контейнер, в котором находятся все ваши элементы управления)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...