[英]C# WPF: GradientStop.ColorProperty Animation Doesn't Work In Storyboard
我最近一直在用C#开发WPF,遇到了上述问题。 我有效的原始代码是:
ColorAnimation backgroundfade = ClrAnim(CanvasGS2.Color, Color.FromRgb(5, 3, 13), 1, 0.8, 0.1);
backgroundfade.BeginTime = TimeSpan.FromSeconds(1.3);
CanvasGS2.BeginAnimation(GradientStop.ColorProperty, backgroundfade);
但是,当我将其添加到情节提要中时,一切运行良好,但动画没有发生。 为了提供上下文,以下代码中的第一个动画发生了,但是第二个动画没有发生:
DoubleAnimation labeltotopleft = DblAnim((double)((Label)selectedlabel).GetValue(Canvas.LeftProperty), 50, 1, 0.8, 0.2);
labeltotopleft.BeginTime = TimeSpan.FromSeconds(0.7);
InitialiseInnerMenu.Children.Add(labeltotopleft);
Storyboard.SetTarget(labeltotopleft, (Label)selectedlabel);
Storyboard.SetTargetProperty(labeltotopleft, new PropertyPath(Canvas.LeftProperty));
//((Label)selectedlabel).BeginAnimation(LeftProperty, labeltotopleft);
ColorAnimation backgroundfade = ClrAnim(CanvasGS2.Color, Color.FromRgb(5, 3, 13), 1, 0.8, 0.1);
backgroundfade.BeginTime = TimeSpan.FromSeconds(1.3);
InitialiseInnerMenu.Children.Add(backgroundfade);
Storyboard.SetTarget(backgroundfade, CanvasGS2);
Storyboard.SetTargetProperty(backgroundfade, new PropertyPath(GradientStop.ColorProperty));
//CanvasGS2.BeginAnimation(GradientStop.ColorProperty, backgroundfade);
原始代码已被注释掉-当我这样做时,两个动画都起作用(以及每个块的前两行)。
属性路径是否有问题?
谢谢
克里斯
我终于有了这个问题的答案,这是我在研究旋转动画时发现的。
适用于这些更抽象的属性的一种方法是使它们成为“名称范围”,然后使用Storyboard.SetTargetName而不是Storyboard Storyboard.SetTarget。 上面的代码可以按如下方式纠正:
没用:
ColorAnimation backgroundfade = ClrAnim(CanvasGS2.Color, Color.FromRgb(5, 3, 13), 1, 0.8, 0.1);
backgroundfade.BeginTime = TimeSpan.FromSeconds(1.3);
InitialiseInnerMenu.Children.Add(backgroundfade);
Storyboard.SetTarget(backgroundfade, CanvasGS2);
Storyboard.SetTargetProperty(backgroundfade, new PropertyPath(GradientStop.ColorProperty));
可以工作:
ColorAnimation backgroundfade = ClrAnim(CanvasGS2.Color, Color.FromRgb(5, 3, 13), 1, 0.8, 0.1);
backgroundfade.BeginTime = TimeSpan.FromSeconds(1.3);
InitialiseInnerMenu.Children.Add(backgroundfade);
try { UnregisterName("CanvasGS2"); }
catch { }
finally { RegisterName("CanvasGS2", CanvasGS2); }
Storyboard.SetTargetName(backgroundfade, "CanvasGS2");
Storyboard.SetTargetProperty(backgroundfade, new PropertyPath(GradientStop.ColorProperty));
需要提及的另一件事是,在开始情节提要时,以下内容将不起作用:
InitialiseInnerMenu.Begin();
需要的是:
InitialiseInnerMenu.Begin(this);
对象名称已由“名称范围”更改为“此”,这就是MainWindow(和默认名称范围)。
实现此目标的另一种方法是将UIElement本身(在这种情况下为Canvas)作为目标,并使用适当的属性路径(对我而言,唯一的缺点是将这些元素放在一起会有些挑战,尽管从长远来看可能是可以学习的)作为字符串。 这样可以节省所有名称的注册,并且不必将参数传递给Storyboard.Begin()。
首先,为了清楚起见,使用XAML:
<Canvas x:Name="MainCanvas" >
<Canvas.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black"/>
<GradientStop x:Name="CanvasGS2" Color="#FF0E0727" Offset="1"/>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
和背后的代码:
ColorAnimation backgroundfade = ClrAnim(CanvasGS2.Color, Color.FromRgb(5, 3, 13), 1, 0.8, 0.1);
backgroundfade.BeginTime = TimeSpan.FromSeconds(1.3);
InitialiseInnerMenu.Children.Add(backgroundfade);
Storyboard.SetTarget(backgroundfade, MainCanvas);
Storyboard.SetTargetProperty(backgroundfade, new PropertyPath("Background.(GradientBrush.GradientStops)[1].(GradientStop.Color)"));
CanvasGS2.BeginAnimation(GradientStop.ColorProperty, backgroundfade);
信息来源:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.