2015-08-10 2 views
2

То, что я пытаюсь сделать, это сделать мой контроль «импульсом» (как в случае увеличения, а затем немного уменьшить, а затем вернуться к нормальному размеру). Следующий код делает именно то, что я хочу, но похоже, что должен быть более простой способ. Это должно быть сделано в коде, потому что это абстрактный класс, из которого извлекается большинство наших элементов управления. У меня нет большого опыта работы с элементами управления анимацией и доски объявлений.Выполнение импульса управления пользователя

Итак, в частности, мой вопрос: существует ли более простой способ получить желаемые результаты, чем следующий метод (хотя все еще выполняется в коде)?

public void Pulse() 
    { 
     var storyboard = new Storyboard 
     { 
      FillBehavior = FillBehavior.Stop, 
      RepeatBehavior = new RepeatBehavior(2) 
     }; 

     double timeIncrement = .15; 
     double changePercent = 20; 

     var firstTime = TimeSpan.FromSeconds(timeIncrement); 
     var secondTime = TimeSpan.FromSeconds(timeIncrement * 3); 
     var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4); 

     var scale = new ScaleTransform(1.0, 1.0); 

     RenderTransformOrigin = new Point(.5, .5); 
     RenderTransform = scale; 

     //enlarge 
     { 
      DoubleAnimation growX = new DoubleAnimation 
      { 
       Duration = firstTime, 
       To = 1 + changePercent 
      }; 
      storyboard.Children.Add(growX); 
      Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX")); 

      DoubleAnimation growY = new DoubleAnimation 
      { 
       Duration = firstTime, 
       To = 1 + changePercent 
      }; 
      storyboard.Children.Add(growY); 
      Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY")); 
     } 

     //shrink 
     { 
      DoubleAnimation shrinkX = new DoubleAnimation 
      { 
       Duration = secondTime, 
       To = 1 - changePercent 
      }; 
      storyboard.Children.Add(shrinkX); 
      Storyboard.SetTargetProperty(shrinkX, new PropertyPath("RenderTransform.ScaleX")); 

      DoubleAnimation shrinkY = new DoubleAnimation 
      { 
       Duration = secondTime, 
       To = 1 - changePercent 
      }; 
      storyboard.Children.Add(shrinkY); 
      Storyboard.SetTargetProperty(shrinkY, new PropertyPath("RenderTransform.ScaleY")); 
     } 

     //back to normal 
     { 
      DoubleAnimation normX = new DoubleAnimation 
      { 
       Duration = thirdTime, 
       To = 1 
      }; 
      storyboard.Children.Add(normX); 
      Storyboard.SetTargetProperty(normX, new PropertyPath("RenderTransform.ScaleX")); 

      DoubleAnimation normY = new DoubleAnimation 
      { 
       Duration = thirdTime, 
       To = 1 
      }; 
      storyboard.Children.Add(normY); 
      Storyboard.SetTargetProperty(normY, new PropertyPath("RenderTransform.ScaleY")); 
     } 

     BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false); 
    } 
+2

Это выглядит довольно просто для меня ... –

ответ

1

Это прекрасный способ сделать это, WPF не предоставляет методы или события для автоматического пульса. Ваше простое и, как вы его создали, вы знаете, как его изменить, как хотите.

+0

Хорошо, спасибо. Я предположил, что где-то должна была быть анимация, которую я отсутствовал, что сделало бы это проще. – claudekennilol

2

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

public void Pulse() 
{ 
    var storyboard = new Storyboard 
    { 
     FillBehavior = FillBehavior.Stop, 
     RepeatBehavior = new RepeatBehavior(2) 
    }; 

    double timeIncrement = .15; 

    double growPercent = 20; 
    double shrinkPercent = -20; 

    var firstTime = TimeSpan.FromSeconds(timeIncrement); 
    var secondTime = TimeSpan.FromSeconds(timeIncrement * 3); 
    var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4); 

    var scale = new ScaleTransform(1.0, 1.0); 

    RenderTransformOrigin = new Point(.5, .5); 
    RenderTransform = scale; 

    storyboard = AddSizeChange(firstTime, growPercent, storyboard); 
    storyboard = AddSizeChange(secondTime, shrinkPercent, storyboard); 
    storyboard = AddSizeChange(thirdTime, growPercent, storyboard); 

    BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false); 
} 

public Storyboard AddSizeChange(TimeSpan animTime, double changePercent, Storyboard storyboard) 
{ 
    DoubleAnimation growX = new DoubleAnimation 
    { 
     Duration = animTime, 
     To = 1 + changePercent 
    }; 
    storyboard.Children.Add(growX); 
    Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX")); 

    DoubleAnimation growY = new DoubleAnimation 
    { 
     Duration = animTime, 
     To = 1 + changePercent 
    }; 
    storyboard.Children.Add(growY); 
    Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY")); 

    return storyboard; 
} 
Смежные вопросы