У меня есть базовый элемент управления типа счетчика, который я выбрал, и он работает достаточно хорошо, но в нем огромное количество повторяющегося кода. По сути, это один и тот же элемент снова и снова, за исключением двух свойств, и одним из этих свойств является 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, передать раскадровке значение для одного из его свойств от элемента выше дерева. Это вообще возможно, или я должен сделать это в коде позади? Это не совсем приятная вещь, которую я могу сделать прямо сейчас, если я решу настроить анимацию вообще.
Спасибо!