最近,我在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);原来的代码被注释掉了--当我这样做的时候,这两个动画都起作用了(以及每个块的前两行)。
这是属性路径的问题吗?
谢谢
克里斯
发布于 2016-01-07 14:54:21
我终于得到了这个问题的答案,这是我在研究旋转动画时发现的。
对这些更抽象的属性有效的一种方法是使它们“命名”,然后使用Storyboard.SetTargetName而不是故事板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);对象名称已被“命名”为“this”,这只是MainWindow (以及默认的名称)。
实现这一目标的另一种方法是将UIElement本身作为一个画布,并使用适当的属性路径(对我来说,唯一的缺点是将这些属性路径组合起来有点困难,尽管从长远来看可能是可以学习的)。这将保存所有的名称注册,并必须将一个参数传递给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);资料来源:
https://stackoverflow.com/questions/32467023
复制相似问题