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