在 WPF 中以编程方式为 UserControl 内的 Grid 的 ScaleTransform 设置动画
Animate ScaleTransform of a Grid inside a UserControl programmatically in WPF
我在将某些动画方法从 WinRT 移植到 WPF 时遇到问题。
我在 UserControl 中有一个网格,我基本上想在降低不透明度的同时放大网格,然后将其不透明度缩小 return 至正常。
这是 UserControl XAML 的一部分:
<Grid x:Name="myGrid">
<Grid.RenderTransform>
<ScaleTransform x:Name="scaleTransform"/>
</Grid.RenderTransform>
<!--Stuff here-->
</Grid>
我在 UserControl 的 .cs 文件中使用这两个属性在代码中获取了这些对象:
public Grid MyGrid
{
get
{
return myGrid;
}
}
public ScaleTransform GridScaleTransform
{
get
{
return scaleTransform;
}
}
现在,我有一个静态 class 以及我用来管理动画的方法。
我需要创建一个带有不透明度和缩放动画的故事板,然后 return 它,以便我可以向其 Closed 事件添加一些处理程序,然后启动它。
这是无法正常工作的静态方法:
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 双动画根本无法启动。我读到我可以尝试使用 SetTargetName 属性,但是由于我在静态方法中并且我只有对目标 UIElement 的引用,所以它不起作用(至少,我没有设法让它起作用方式)。
这段代码有什么问题?
谢谢!
塞尔吉奥
尝试使用网格作为目标元素:
Storyboard.SetTarget(scaleXAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleXAnimation,
new PropertyPath("RenderTransform.ScaleX"));
Storyboard.SetTarget(scaleYAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleYAnimation,
new PropertyPath("RenderTransform.ScaleY"));
我在将某些动画方法从 WinRT 移植到 WPF 时遇到问题。
我在 UserControl 中有一个网格,我基本上想在降低不透明度的同时放大网格,然后将其不透明度缩小 return 至正常。
这是 UserControl XAML 的一部分:
<Grid x:Name="myGrid">
<Grid.RenderTransform>
<ScaleTransform x:Name="scaleTransform"/>
</Grid.RenderTransform>
<!--Stuff here-->
</Grid>
我在 UserControl 的 .cs 文件中使用这两个属性在代码中获取了这些对象:
public Grid MyGrid
{
get
{
return myGrid;
}
}
public ScaleTransform GridScaleTransform
{
get
{
return scaleTransform;
}
}
现在,我有一个静态 class 以及我用来管理动画的方法。
我需要创建一个带有不透明度和缩放动画的故事板,然后 return 它,以便我可以向其 Closed 事件添加一些处理程序,然后启动它。
这是无法正常工作的静态方法:
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 双动画根本无法启动。我读到我可以尝试使用 SetTargetName 属性,但是由于我在静态方法中并且我只有对目标 UIElement 的引用,所以它不起作用(至少,我没有设法让它起作用方式)。
这段代码有什么问题?
谢谢!
塞尔吉奥
尝试使用网格作为目标元素:
Storyboard.SetTarget(scaleXAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleXAnimation,
new PropertyPath("RenderTransform.ScaleX"));
Storyboard.SetTarget(scaleYAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleYAnimation,
new PropertyPath("RenderTransform.ScaleY"));