如何重用单个文字值来初始化XAML资源字典中的多种不同类型?

时间:2020-07-21 08:00:00

标签: wpf xaml

XAML中的许多类型都具有接受相同格式输入的转换器,但是类型本身不是隐式兼容的。例如,“ 0:0:4”可以是“持续时间”或“关键时间”。有时我想对这些事情使用相同的值。例如,也许我有一个KeyTime在另一个动画的持续时间之后立即开始:

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0" />

问题在于无法表达这些值应该相同的约定。所以我想要的是类似的东西:

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

但是我不确定这个语法。我假设我需要为Duration / Keytime调用转换器,但是我发现XAML语法并不总是最直观的。

1 个答案:

答案 0 :(得分:2)

代替直接使用StaticResource之类的

KeyTime="{StaticResource AnimationTime}"

您可能经常将Binding与资源作为Source对象一起使用

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

并因此受益于自动类型转换。

一个例子:

<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>