2013-09-24 2 views
0

У меня около 50 <Path> элементов на холсте через <Viewbox>. <Viewbox> также вложен. Я хотел бы изменить непрозрачность <Path>, когда их местоположения соответствуют местоположению данных датчика. Код работает до метода Begin(). Он не дает ошибки, он ничего не делает. Я также попытался создать разные NameScopes, но не смог указать правильное namspace. Все, кроме this, не переходит к методу Begin(). Если я создаю новый Scope внутри оператора if: «if (wantedNode is System.Windows.Shapes.Path)» он запускает один раз(), не запускается и никогда не возвращается!C# Storyboard Begin() Не стрельба

if (angle > 0) 
     { 
      if (angle <= 180 && angle > 150) 
      { 
       if (mag <= sweetSpot) 
       { 
        //posAlertTxt.Text = "On target..."; 
       } 
       else if (mag <= step) 
       { 
        selectedStep = "step0108"; 
       } 
       else if (mag <= step * 2) 
       . 
       . 
       . 
       . 

После всех углов и величины покрыты:

redBrush.Color = Colors.IndianRed; 

      System.Windows.Media.Animation.DoubleAnimation opacityAnimation = new System.Windows.Media.Animation.DoubleAnimation(); 

      opacityAnimation.To = 1.0; 
      opacityAnimation.Duration = TimeSpan.FromSeconds(1); 
      opacityAnimation.AutoReverse = true; 

      RegisterName("redBrush", redBrush); 

      Storyboard sb = new System.Windows.Media.Animation.Storyboard(); 

      Storyboard.SetTargetName(opacityAnimation, "redBrush"); 
      Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath(SolidColorBrush.OpacityProperty)); 

      sb.Children.Add(opacityAnimation); 

      object wantedNode = indicatorBounds.FindName(selectedStep); 
      if (wantedNode is System.Windows.Shapes.Path){ 
       System.Windows.Shapes.Path wantedChild = wantedNode as System.Windows.Shapes.Path; 
       wantedChild.Fill = redBrush; 
       //System.Diagnostics.Debug.WriteLine(wantedChild.Opacity);   
       sb.Begin(this); 

И, наконец, XAML:

. 
. 
. 
. 
<Viewbox Name="forceGradientContainer" Width="126" Height="457" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="117" Canvas.Top="17"> 
    <Canvas Name="indicatorBounds" Width="126.378" Height="457.004"> 
     <Canvas Name="holder"> 
      . 
      . 
      . 
      . 
      <Path Fill="IndianRed" Opacity="0" x:Name="step0108" Data="F1 M 28.802,209.027 L  49.252,221.067 C 47.922,223.377 47.162,226.057 47.162,228.917 L 23.432,228.917 C 23.432,221.667 25.392,214.867 28.802,209.027 Z"/>` 
      . 
      . 
      . 
     </Canvas>  
    </Canvas> 
</Viewbox> 

ответ

0

Попробуйте

Storyboard.SetTarget(opacityAnimation, redBrush); 

вместо

RegisterName("redBrush", redBrush); 
Storyboard.SetTargetName(opacityAnimation, "redBrush"); 

И почему вы просто не анимируете непрозрачность самого элемента?

Storyboard.SetTarget(opacityAnimation, wantedChild); 
Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity")); 
+0

Это сделало трюк. Благодаря! Похоже, что параметр AutoReverse работает некорректно. Это должно быть потому, что функция вызывается снова, когда датчик движется (до того, как предыдущий вызов может исчезнуть). В любом случае, чтобы пузырить это? – atomSmasher

+0

Попробуйте установить свойство AutoReverse на свой экземпляр раскадровки: 'sb.AutoReverse = true;'. Возможно, opacityAnimation принимает значение AutoReverse при добавлении его в 'sb', который по умолчанию является false. –

+0

Нет. Я закончил создание еще одной анимации после первого начала, которая занимает непрозрачность до 0. Это все равно, но лучше, но лучше. – atomSmasher

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