2014-01-14 41 views
0

我創建了我自己的繼承自FrameworkElement的類(對於Triggers屬性)。我想申請一個動畫,這將改變Angle屬性:如何在WPF中的自定義類上應用動畫?

<MyClass Name="MyName" Angle="30"> 
    <MyClass.Triggers> 
     <EventTrigger RoutedEvent="Window.Loaded"> 
      <BeginStoryboard> 
       <Storyboard RepeatBehavior="Forever"> 
        <DoubleAnimation Storyboard.TargetName="MyName" 
          Storyboard.TargetProperty="Angle" From="0" To="90" 
          Duration="0:0:1" BeginTime="0:0:0"/> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </MyClass.Triggers> 
</MyClass> 

類本身看起來是這樣的:

public class MyClass: FrameworkElement 
{ 
    //dependency property 
    public const string AnglePropertyName = "Angle"; 

    public double Angle 
    { 
     get 
     { 
      return (double)GetValue(AngleProperty); 
     } 
     set 
     { 
      SetValue(AngleProperty, value); 
     } 
    } 

    public static readonly DependencyProperty AngleProperty = 
     DependencyProperty.Register(AnglePropertyName, typeof(double), typeof(MyClass), new UIPropertyMetadata(new double())); 
} 

不幸的是動畫不起作用。如果我把EventTrigger放在裏面,比方說Button.Triggers,那麼它就可以工作。我在寫課程的時候錯過了什麼?

+0

您可以驗證我們,角度的值不會改變?屬性setter中的斷點是不夠的。您需要使用接受PropertyChanged回調的UIPropertyMetadata構造函數重載作爲綁定/樣式/動畫直接訪問依賴項屬性,而不是getter/setter對。 http://msdn.microsoft.com/en-us/library/ms587986%28v=vs.110%29.aspx – Gusdor

+0

@Gusdor:說實話,我甚至不知道該怎麼做。我應該從UIPropertyMetadata類創建一個新的類,並重寫它的構造函數嗎? –

+0

這裏有個很好的例子http://social.msdn.microsoft.com/Forums/vstudio/en-US/9c641ca3-58a0-4adf-b73f-f1cb4761e883/how-do-i-detect-change-to-any -property-on-a-dependencyobject?forum = wpf – Gusdor

回答

0
<MyClass Name="MyName" Angle="30"> 
    <MyClass.Style> 
     <Style TargetType="MyClass"> 
      <Style.Triggers> 
       <Trigger Property="IsLoaded"> 
        <Setter Property="Angle" Value="90"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </MyClass.Style> 
</MyClass> 

嘗試用這個..

+0

在這兩種情況下,我都有一個例外。第一個代碼的內部異常:「觸發器集合成員必須是EventTrigger類型的。」對於第二個代碼:「觸發器上的屬性不能爲空。」 –

+0

第二個代碼是否會拋出異常? – Sankarann

+0

是的,第一和第二(我寫了上面的例外的內容)。你有什麼想法,有什麼可能出錯? –