Wiele typów w XAML ma konwertery, które akceptują identyczne wejścia formatu, ale same typy nie są niejawne kompatybilne. Na przykład "0: 0: 4" może być czas trwania lub klawisza wśród wielu innych. Czasami chciałbym użyć tej samej wartości dla tych rzeczy. Na przykład być może mam klawisz, który zaczyna się tuż po czasie trwania innej animacji:

<Duration x:Key="Foo">0:0:4</Duration>
<KeyTime x:Key="Bar">0:0:4</KeyTime>

Problem z tym jest, że nie ma sposobu na wyrażenie umowy, że wartości te powinny być takie same. Więc co chciałbym, jest czymś wzdłuż linii:

<system:String x:Key="AnimationTime">0:0:4</system:String>
<Duration x:Key="Foo">[AnimationTime]</Duration>
<KeyTime x:Key="Bar">[AnimationTime]</KeyTime>

Ale jestem niepewny z składni dla tego. Zakładam, że muszę wywołać konwertery na czas trwania / klawisz, ale znalazłem składnię XAML, nie zawsze jest najbardziej intuicyjny.

1
Russell Bearden 21 lipiec 2020, 11:00

1 odpowiedź

Najlepsza odpowiedź

Zamiast bezpośrednio używać Staticresource

KeyTime="{StaticResource AnimationTime}"

Często możesz używać wiązania z zasobem jako obiekt Source

KeyTime="{Binding Source={StaticResource AnimationTime}}"

A tym samym korzystać z automatycznego konwersji typu.

Przykład:

<Window.Resources>
    <system:String x:Key="AnimationTime">0:0:4</system:String>

    <Storyboard x:Key="ExampleStoryboard">
        <DoubleAnimation To="1"
            Storyboard.TargetProperty="Opacity"
            Duration="{Binding Source={StaticResource AnimationTime}}"/>

        <ObjectAnimationUsingKeyFrames
            Storyboard.TargetProperty="Background">
            <DiscreteObjectKeyFrame
                KeyTime="{Binding Source={StaticResource AnimationTime}}"
                Value="{x:Static Brushes.Green}"/>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>

<Grid Background="Red" Opacity="0">
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard
                Storyboard="{StaticResource ExampleStoryboard}"/>
        </EventTrigger>
    </Grid.Triggers>
</Grid>
2
Clemens 22 lipiec 2020, 05:31