2011-01-27 48 views
0

我創建了一個具有Storyboard類型屬性的自定義用戶控件。喜歡的東西:使用XAML,自定義屬性和動畫的Silverlight中的奇怪問題

public class UC : UserControl 
{ 
    public static readonly DependencyProperty AnimationProperty = DependencyProperty.Register(
     "Animation", 
     typeof(Storyboard), 
     typeof(UC), 
     null); 

    public Storyboard Animation 
    { 
     get { return (Storyboard)GetValue(AnimationProperty); } 
     set { SetValue(AnimationProperty, value); } 
    } 

    public UC() 
    { 
     this.Loaded += new RoutedEventHandler(UC_Loaded); 
    } 

    private void UC_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (this.Animation != null) 
     { 
      this.Animation.Begin(); 
     } 
    } 
} 

在XAML中,我用它如下:

<loc:UC x:Name="uc" Opacity="0" > 
    <TextBlock FontSize="50">Some text</TextBlock> 
    <loc:UC.Animation> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="uc" Storyboard.TargetProperty="Opacity" To="0.5" Duration="0:0:1" /> 
     </Storyboard> 
    </loc:UC.Animation> 
</loc:UC> 

到目前爲止好。

後來我決定我需要另一件物品和故事板。所以我改變了代碼來接受一個包含故事板和另一條信息的自定義對象。喜歡的東西:

public class UC : UserControl 
{ 
    public static readonly DependencyProperty AnimationProperty = DependencyProperty.Register(
     "Animation", 
     typeof(AnimationHolder), 
     typeof(UC), 
     null); 

    public AnimationHolder Animation 
    { 
     get { return (AnimationHolder)GetValue(AnimationProperty); } 
     set { SetValue(AnimationProperty, value); } 
    } 

    public UC() 
    { 
     this.Loaded += new RoutedEventHandler(UC_Loaded); 
    } 

    private void UC_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (this.Animation != null) 
     { 
      this.Animation.Animation.Begin(); 
     } 
    } 
} 

public class AnimationHolder 
{ 
    public Storyboard Animation 
    { 
     get; 
     set; 
    } 

    public int OtherValue 
    { 
     get; 
     set; 
    } 
} 

而在XAML中使用它:

<loc:UC x:Name="uc" Opacity="0" > 
    <TextBlock FontSize="50">Some text</TextBlock> 
    <loc:UC.Animation> 
     <loc:AnimationHolder OtherValue="20"> 
      <loc:AnimationHolder.Animation> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetName="uc" Storyboard.TargetProperty="Opacity" To="0.5" Duration="0:0:0" /> 
       </Storyboard> 
      </loc:AnimationHolder.Animation>        
     </loc:AnimationHolder> 
    </loc:UC.Animation> 
</loc:UC> 

但是,現在當我嘗試開始動畫我得到消息一個InvalidOperationException:「無法解析的TargetName UC」

任何人都有一個想法,爲什麼?

我知道在這個例子中,我可以通過不使用自定義對象並使用其他屬性來解決該問題。但是,這是我的方案的簡化版本,它着重解決問題。在真實場景中,我必須使用自定義對象。

回答

1

有兩件事情需要與你的新方法進行:

  • AnimationHolder類,使Animation屬性依賴屬性,就像它以前是。
  • DependencyObject導出AnimationHolder類。這是必要的,以便您可以使Animation成爲依賴項屬性。請記住,只有從DependencyObject派生的類才能定義依賴屬性!

我覺得一旦你做了這兩件事,它就能解決你的問題!

+0

感謝您的建議,但我只是試了一下,它沒有奏效。 我得到完全相同的行爲。 – 2011-01-27 15:38:09