Chociaż odpowiedź, która proponuje dołączenie animacji bezpośrednio do elementu, który ma być animowany, rozwiązuje ten problem w prostych przypadkach, nie jest to możliwe do zastosowania, gdy mamy złożoną animację, która musi być ukierunkowana na wiele elementów. (Możesz dołączyć animację do każdego elementu, oczywiście, ale zarządzanie nim jest naprawdę okropne.)
Jest więc alternatywny sposób rozwiązania tego problemu, który pozwala użyć animacji, która atakuje wybrane elementy.
Istnieją trzy miejsca, w które można dołączyć wyzwalacze w WPF: elementy, style i szablony. Jednak pierwsze dwie opcje nie działają tutaj. Pierwsza jest wykluczona, ponieważ WPF nie obsługuje użycia elementu DataTrigger
bezpośrednio. (O ile wiem, kiedy pytałem ludzi w zespole WPF o to wiele lat temu, powiedzieli, że woleliby to poprzeć, ale nie mieć czas, aby to zadziałało.) A style są niedostępne, ponieważ, jak napisano w zgłoszeniu o błędzie, nie można kierować na wskazane elementy w animacji związanej ze stylem.
Zostawia to szablony. Możesz użyć do tego celu szablonów kontrolnych lub danych.
<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>
Przy tej konstrukcji WPF z przyjemnością pozwala animacji odwoływać się do nazwanych elementów wewnątrz szablonu. (Zostawiłem tu zarówno animację, jak i zawartość szablonu - oczywiście wypełniłeś to faktyczną treścią animacji.)
Powodem, dla którego działa to w szablonie, ale nie w stylu, jest to, że po zastosowaniu szablon, nazwane przez niego elementy będą zawsze obecne, a więc bezpieczne dla animacji zdefiniowanych w zakresie tego szablonu w odniesieniu do tych elementów. Zwykle nie jest tak w przypadku stylu, ponieważ style mogą być stosowane do wielu różnych elementów, z których każdy może mieć zupełnie inne drzewa wizualne. (To trochę frustrujące, że uniemożliwia ci to nawet w scenariuszach, kiedy możesz być pewien, że wymagane elementy będą tam, ale może jest coś, co bardzo utrudnia animację związaną z nazwanymi elementami po prawej stronie Wiem, że istnieje wiele optymalizacji w WPF, aby umożliwić efektywne wykorzystanie elementów stylu, więc być może jedna z nich sprawia, że jest to trudne.)
Cóż, właśnie to miałem nadzieję unikaj ... Ale powiedzmy, że to robię: wszelkie przykłady implementacji RoutedEvent w klasie, która NIE pochodzi od UIElement? –