繁体   English   中英

C#WPF:GradientStop.ColorProperty动画在情节提要中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM