Muchos tipos de XAML tienen convertidores que aceptan entradas de formato idénticas, pero los tipos en sí no son implícitamente compatibles. Por ejemplo, "0: 0: 4" puede ser una duración o un tiempo clave entre muchos otros. Y a veces me gustaría usar el mismo valor para este tipo de cosas. Por ejemplo, quizás tengo un KeyTime que comienza justo después de la Duración de otra animación:

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

El problema con esto es que no hay forma de expresar el contrato de que estos valores deberían ser los mismos. Entonces, lo que me gustaría es algo como:

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

Pero no estoy seguro de la sintaxis de esto. Supongo que necesito invocar a los convertidores para Duration / Keytime, pero encuentro que la sintaxis XAML no siempre es la más intuitiva.

1
Russell Bearden 21 jul. 2020 a las 11:00

1 respuesta

La mejor respuesta

En lugar de usar directamente StaticResource como

KeyTime="{StaticResource AnimationTime}"

A menudo puede usar un enlace con el recurso como un objeto Source como

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

Y así beneficiarse de la conversión automática de tipos.

Un ejemplo:

<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 jul. 2020 a las 05:31