我创建了一个具有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。”
任何人都知道为什么?
我知道在这个例子中,我可以通过不使用自定义对象和使用其他属性来解决问题。然而,这是我的场景的简化版本,其重点是该问题。在真实场景中,我必须使用自定义对象。
答案 0 :(得分:1)
您的新方法需要做两件事:
AnimationHolder
类中,将Animation
属性设为依赖属性,就像以前一样。AnimationHolder
获取DependencyObject
课程。这是必要的,这样您就可以使Animation
成为依赖属性。请记住,只有从DependencyObject
派生的类才能定义依赖属性!我认为一旦你做了这两件事,它就能解决你的问题!