2015-01-01 6 views
0

У меня возникли проблемы с переносом некоторых методов анимации из WinRT в WPF.Анимация ScaleTransform сетки внутри UserControl программно в WPF

У меня есть сетка внутри UserControl, и я в основном хочу масштабировать сетку, уменьшая ее непрозрачность, а затем масштабирую ее обратно, при этом ее непрозрачность возвращается в нормальное состояние.

Это часть XAML в UserControl:

<Grid x:Name="myGrid"> 
     <Grid.RenderTransform> 
      <ScaleTransform x:Name="scaleTransform"/> 
     </Grid.RenderTransform> 
     <!--Stuff here--> 
</Grid> 

И я получаю эти объекты в коде с этими двумя свойствами в файле .cs в UserControl:

public Grid MyGrid 
{ 
    get 
    { 
     return myGrid; 
    } 
} 

public ScaleTransform GridScaleTransform 
{ 
    get 
    { 
     return scaleTransform; 
    } 
} 

сейчас , У меня есть статический класс с методами, которые я использую для управления анимациями.

Мне нужно создать раскадровку с непрозрачностью и масштабированием анимации, а затем вернуть ее, чтобы я мог добавить некоторые обработчики в свое закрытое событие, а затем запустить его.

Это статический метод, который не работает должным образом:

private static Storyboard createGridAnimation(MyUserControl element, double fromScale, double toScale, bool animIn = false) 
{ 
    Storyboard storyboard = new Storyboard(); 

    //Add the opacity animation only if the animation is the one that scales up the grid 
    if (animIn) 
    { 
     DoubleAnimationUsingKeyFrames opacityAnim= new DoubleAnimationUsingKeyFrames(); 
     opacityAnim.Duration = new Duration(TimeSpan.FromMilliseconds(200)); 
     //Some keyframes here... 
     Storyboard.SetTarget(opacityAnim, element.MyGrid); 
     Storyboard.SetTargetProperty(opacityAnim, new PropertyPath(UIElement.OpacityProperty)); 
     storyboard.Children.Add(opacityAnim); 
    }    

    //Scale X 
    DoubleAnimation scaleXAnimation = new DoubleAnimation() { From = fromScale, To = 2.0, AutoReverse = false }; 
    scaleXAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(100)); 
    Storyboard.SetTarget(scaleXAnimation, element.GridScaleTransform); 
    Storyboard.SetTargetProperty(scaleXAnimation, new PropertyPath(ScaleTransform.ScaleXProperty)); 

    //Scale Y 
    DoubleAnimation scaleYAnimation = new DoubleAnimation() { From = fromScale, To = 2.0, AutoReverse = false }; 
    scaleXAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(100)); 
    Storyboard.SetTarget(scaleYAnimation, elemento.GridScaleTransform); 
    Storyboard.SetTargetProperty(scaleYAnimation, new PropertyPath(ScaleTransform.ScaleYProperty)); 

    storyboard.Children.Add(scaleXAnimation); 
    storyboard.Children.Add(scaleYAnimation); 
    return storyboard; 
} 

Проблема заключается в том, что единственная анимация, которая работает в непрозрачности анимации, два ScaleTransform doubleAnimations просто не заводятся. Я читал, что могу попробовать использовать свойство SetTargetName, но так как я внутри статического метода, и у меня есть только ссылка на целевой UIElement, он не работает (по крайней мере, мне не удалось заставить его работать путь).

Что не так с этим кодом?

Спасибо!

Sergio

ответ

1

Попробуйте использовать сетку в качестве целевого элемента:

Storyboard.SetTarget(scaleXAnimation, element.MyGrid); 
Storyboard.SetTargetProperty(scaleXAnimation, 
    new PropertyPath("RenderTransform.ScaleX")); 

Storyboard.SetTarget(scaleYAnimation, element.MyGrid); 
Storyboard.SetTargetProperty(scaleYAnimation, 
    new PropertyPath("RenderTransform.ScaleY")); 
+0

Спасибо, это работает! Я просто пропустил это: если я попытаюсь программно получить свойство ScaleY, я не могу его увидеть, почему? Я имею в виду, элемент .MyGrid.RenderTransform не имеет свойства ScaleX или ScaleY, поэтому как этот PropertyPath может работать в Double Animation? Еще раз спасибо! – Sergio0694

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