首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# WPF: GradientStop.ColorProperty动画在故事板中不起作用

C# WPF: GradientStop.ColorProperty动画在故事板中不起作用
EN

Stack Overflow用户
提问于 2015-09-08 20:51:16
回答 1查看 248关注 0票数 1

最近,我在C#中开发了一个WPF,并遇到了上述问题。我最初的代码是:

代码语言:javascript
复制
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);

然而,当我将它添加到故事板中时,一切都运行良好,但动画没有发生。为了提供上下文,会出现以下代码中的第一个动画,但第二个动画不会:

代码语言:javascript
复制
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);

原来的代码被注释掉了--当我这样做的时候,这两个动画都起作用了(以及每个块的前两行)。

这是属性路径的问题吗?

谢谢

克里斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 14:54:21

我终于得到了这个问题的答案,这是我在研究旋转动画时发现的。

对这些更抽象的属性有效的一种方法是使它们“命名”,然后使用Storyboard.SetTargetName而不是故事板Storyboard.SetTarget。上述代码可按以下方式进行补救:

不起作用:

代码语言:javascript
复制
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));

是否有效:

代码语言:javascript
复制
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));

另一件需要提及的事情是,当涉及到故事板的开头时,以下内容将无法工作:

代码语言:javascript
复制
InitialiseInnerMenu.Begin();

我们需要的是:

代码语言:javascript
复制
InitialiseInnerMenu.Begin(this);

对象名称已被“命名”为“this”,这只是MainWindow (以及默认的名称)。

实现这一目标的另一种方法是将UIElement本身作为一个画布,并使用适当的属性路径(对我来说,唯一的缺点是将这些属性路径组合起来有点困难,尽管从长远来看可能是可以学习的)。这将保存所有的名称注册,并必须将一个参数传递给Storyboard.Begin()。

首先,为了清晰起见,XAML:

代码语言:javascript
复制
<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>

而代码背后:

代码语言:javascript
复制
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);

资料来源:

Storyboard doesn't work

Animate color property with different brushes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32467023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档