Хотя ответ, в котором предлагается прикрепить анимацию непосредственно к анимируемому элементу, решает эту проблему в простых случаях, на самом деле это невозможно, если у вас есть сложная анимация, которая должна быть нацелена на несколько элементов. (Конечно, вы можете прикрепить анимацию к каждому элементу, но управлять ею становится довольно ужасно.)
Таким образом, существует альтернативный способ решения этой проблемы, который позволяет использовать DataTrigger
для запуска анимации, нацеленной на именованные элементы.
Есть три места, где вы можете прикрепить триггеры в WPF: элементы, стили и шаблоны. Однако первые два варианта здесь не работают. Первое исключено, потому что WPF не поддерживает использование DataTrigger
непосредственно для элемента. (Насколько я знаю, нет особой причины для этого. Насколько я помню, когда я спрашивал людей из команды WPF об этом много лет назад, они говорили, что хотели бы поддержать это, но не у вас есть время, чтобы заставить его работать.) И стили отсутствуют, потому что, как сообщается в сообщении об ошибке, вы не можете указывать именованные элементы в анимации, связанной со стилем.
Так что оставляет шаблоны. И вы можете использовать для этого либо элементы управления, либо шаблоны данных.
<ContentControl>
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<ControlTemplate.Resources>
<Storyboard x:Key="myAnimation">
<!-- Your animation goes here... -->
</Storyboard>
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
<DataTrigger
Binding="{Binding MyProperty}"
Value="DesiredValue">
<DataTrigger.EnterActions>
<BeginStoryboard
x:Name="beginAnimation"
Storyboard="{StaticResource myAnimation}" />
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard
BeginStoryboardName="beginAnimation" />
</DataTrigger.ExitActions>
</DataTrigger>
</ControlTemplate.Triggers>
<!-- Content to be animated goes here -->
</ControlTemplate>
</ContentControl.Template>
<ContentControl>
С этой конструкцией WPF с удовольствием разрешает анимации ссылаться на именованные элементы внутри шаблона. (Я оставил здесь и анимацию, и содержимое шаблона пустым - очевидно, вы бы заполнили это фактической анимацией и содержимым.)
Причина, по которой это работает в шаблоне, но не в стиле, заключается в том, что при применении шаблона всегда будут присутствовать именованные элементы, которые он определяет, и поэтому для анимаций, определенных в области действия этого шаблона, безопасно обращаться к этим элементам. Как правило, это не относится к стилю, поскольку стили могут применяться к нескольким различным элементам, каждый из которых может иметь совершенно разные визуальные деревья. (Немного огорчает, что это мешает вам делать это даже в сценариях, когда вы можете быть уверены, что требуемые элементы будут там, но, возможно, есть кое-что, что сильно затрудняет привязку анимации к именованным элементам справа Я знаю, что в WPF довольно много оптимизаций, позволяющих эффективно повторно использовать элементы стиля, поэтому, возможно, одним из них является то, что затрудняет поддержку.)