2011-01-27 10 views
0

Storyboard型のプロパティを持つカスタムユーザーコントロールを作成しました。 XAMLで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(); 
     } 
    } 
} 

次のように私はそれを使用する:ような何か

<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

2つのことは、あなたの新しいアプローチで行われる必要があります。

  • クラスAnimationHolderでは、それは以前だっただけのように、Animationプロパティ依存関係プロパティにします。
  • AnimationHolderクラスをDependencyObjectから派生させます。これは、Animationを依存関係プロパティにするために必要です。 DependencyObjectから派生したクラスだけが依存関係プロパティを定義できることに注意してください。

この2つのことを一度行うと、問題が解決すると思います。

+0

提案していただきありがとうございますが、私はそれを試してみましたが動作しませんでした。 私はまったく同じ動作をします。 –

関連する問題