2009-12-15 2 views
1

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

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

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

Спасибо!

ответ

0

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

-sa

Смежные вопросы