Czy istnieje sposób na zdefiniowanie animacji gdzieś w Xaml (np. Jako zasobu), a następnie wielokrotne użycie jej wielokrotnie? Mam wiele niezależnych pędzli w różnych datata-płytach, które niezależnie muszą uruchomić ten sam rodzaj animacji w oparciu o datatrigger. Teraz wydaje się, że animacja musi zdefiniować Storyboard.TargetName i Storyboard.TargetProperty. To prawie pokonuje cel ponownego użycia. Chciałbym jakoś zadeklarować "użyj tej animacji z zasobu, ale tym razem zastosuj ją do innego elementu".definiować animacje i wyzwalacze jako zasoby wielokrotnego użytku?
Dla mnie jest to raczej podstawowe, ważne i zasadnicze żądanie i jestem zaskoczony, że nie jest to łatwe do osiągnięcia. Czy coś mi umyka?
To samo dotyczy wyzwalaczy. Załóżmy, że mam wiele różnych elementów wizualnych, które reprezentują ten sam typ stanu za pomocą animacji kolorów. Na przykład. przejście do koloru zielonego, gdy "aktywny" zaniknie do "czerwonego", gdy "błąd" itp. Jedyną różnicą między obrazami jest ich kształt/drzewo wizualne, a pożądane zachowanie animacji jest takie samo, wszystkie mają element gdzieś w ich wizualnym drzewie, które ma właściwość koloru typu. Myślę, że nie jest trudno wyobrazić sobie, jak żmudne jest ponowne definiowanie tych samych animacji i zestawów datatriggerów w kółko. Każdy programista tego nie znosi. Rozpaczliwie szukam łatwiejszego rozwiązania, które nie wymaga żadnego (lub przynajmniej bardzo małego) kodu C#.
Co mam wymyślić do tej pory to:
Zdefiniuj animacje w zasobie lik ten (powtórz to dla wszystkich podstawowych stanów, które istnieją, jak aktywującego, aktywny, nieaktywny, błąd):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
sposobie wykorzystywania w serii ujęć w wyzwalacze (powtórz to zillions razy dla każdego państwa X każdej differnt stateviusal, zawsze wymyślić nową nazwę dla serii ujęć):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
Możesz łatwo sobie wyobrazić, ile razy XAML muszę w kółko kopiować i wklejać dla wszystkich tych Zillion DataTrigger.
Byłoby fajnie zdefiniować wszystkie te wyzwalacze jeden raz i zastosować je do różnych wizualizacji stanu. Jak coś takiego rozwiązano w WPF? Jakaś wskazówka?
Wiem, że próbowałem wielu różnych rzeczy, aby wymyślić propozycję dla tego i po prostu nie było to możliwe bez robienia czegoś w kodzie. Jest to równie dobre rozwiązanie, jak sądzę, że dostaniesz. Hurray dla rozszerzalności WPF, prawda? :) –
Dobrym pomysłem może być wykorzystanie API zachowania silverlight. Czy sie zgadzasz? Czy jest kompatybilny ze standardową strukturą .net 3.5? – bitbonk
Nie jest to niezgodne, chociaż podobno. Szczerze myślę, że znalazłeś świetne rozwiązanie, które wykorzystuje architekturę WPF w bardzo "naturalny" sposób i nie powinno się tu w ogóle odgadywać. –