Silverlight中使用XAML,自定义属性和动画的奇怪问题

时间:2011-01-27 04:53:59

标签: silverlight xaml animation storyboard

我创建了一个具有Storyboard类型属性的自定义用户控件。类似的东西:

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 个答案:

答案 0 :(得分:1)

您的新方法需要做两件事:

  • AnimationHolder类中,将Animation属性设为依赖属性,就像以前一样。
  • AnimationHolder获取DependencyObject课程。这是必要的,这样您就可以使Animation成为依赖属性。请记住,只有从DependencyObject派生的类才能定义依赖属性!

我认为一旦你做了这两件事,它就能解决你的问题!