簡體   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