WPF - Назначение времени начала раскадровки из родительского элемента

У меня есть базовый элемент управления типом счетчика, который я разработал, и он работает достаточно хорошо, но повсюду в нем много повторяющегося кода. По сути, это один и тот же элемент снова и снова, за исключением двух свойств, и одним из этих свойств является BeginTime для раскадровки - каждая строка просто бесконечно повторяет свою анимацию, но каждая строка начинается на 0,1 секунды после предыдущей для приятного небольшой волновой эффект.

Вот общая идея кода:

<UserControl x:Class="MyNamespace.Spinner"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Rectangle Fill="Black" Opacity="0.5"
                   Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=Width}"
                   Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=Height}" />
        <Line X1="9" X2="11" Y1="10" Y2="20">
            <Line.Triggers>
                <EventTrigger RoutedEvent="Line.Loaded">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard RepeatBehavior="Forever" Duration="0:0:0.8"
                                        BeginTime="0:0:0.1">
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="0%" />
                                    <LinearDoubleKeyFrame Value="1.0" KeyTime="12.5%" />
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="75%" />
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="100%" />
                                </DoubleAnimationUsingKeyFrames>
                             </Storyboard>
                         </BeginStoryboard>
                     </EventTrigger.Actions>
                 </EventTrigger>
             </Line.Triggers>
         </Line>
        <Line X1="14" X2="16" Y1="10" Y2="20">
            <Line.Triggers>
                <EventTrigger RoutedEvent="Line.Loaded">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard RepeatBehavior="Forever" Duration="0:0:0.8"
                                        BeginTime="0:0:0.2">
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="0%" />
                                    <LinearDoubleKeyFrame Value="1.0" KeyTime="12.5%" />
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="75%" />
                                    <LinearDoubleKeyFrame Value="0.5" KeyTime="100%" />
                                </DoubleAnimationUsingKeyFrames>
                             </Storyboard>
                         </BeginStoryboard>
                     </EventTrigger.Actions>
                 </EventTrigger>
             </Line.Triggers>
         </Line>

    <!-- And so on and so forth, 6 more times -->
    </Grid> 
</UserControl>

Я не хотел публиковать все это, возможно, было бы слишком больно смотреть на это, но вы поняли. Единственное, что меняется с Line.Triggers на /Line.Triggers в каждом из них, - это BeginTime для раскадровки. Есть ли способ в XAML, чтобы я мог определить этот BeginTime в строке, а затем прочитать его в раскадровке, чтобы я мог сделать что-то более близкое к:

<UserControl.Resources>
    <!-- Try to read BeginTime from ancestral element -->
    <Storyboard x:Key="myStoryboard" RepeatBehavior="Forever" Duration="0:0:0.8"
                BeginTime="{Binding SomeSource, Property=StoryboardBeginTime}">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
            <LinearDoubleKeyFrame Value="0.5" KeyTime="0%" />
            <LinearDoubleKeyFrame Value="1.0" KeyTime="12.5%" />
            <LinearDoubleKeyFrame Value="0.5" KeyTime="75%" />
            <LinearDoubleKeyFrame Value="0.5" KeyTime="100%" />
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl.Resources>
    <!-- Try to send BeginTime to storyboard contained within -->
    <Line Blah="blah" StoryboardBeginTime="0:0:0.1">
        <Line.Triggers>
            <EventTrigger>
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
                </EventTrigger.Actions>
            </EventTrigger>
        </Line.Triggers>
    </Line>

Я просто не могу отследить, есть ли способ сделать это в XAML, передать раскадровке значение для одного из его свойств из элемента выше по дереву. Возможно ли такое вообще, или мне лучше сделать это в коде программной части? Это не совсем самое приятное занятие, если я вообще решу настроить анимацию.

Спасибо!


person Brian    schedule 15.12.2009    source источник


Ответы (1)


кажется, что это невозможно - хотя могло бы быть и с 4.0, но я это не тестировал. Вы можете сделать это с помощью кода программной части.

-sa

person Sascha    schedule 23.07.2010