Я создал пользовательский элемент управления, который имеет свойство типа Storyboard. Что-то вроде:Очень странная проблема в Silverlight с XAML, настраиваемым свойством и анимацией
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 с сообщением: «Не удается разрешить Имя_целевого_объекта ЯК»
У кого-нибудь есть идея, почему?
Я знаю, что в этом примере я могу обойти проблему, не используя пользовательский объект и вместо этого используя другое свойство. Однако это упрощенная версия моего сценария, которая фокусируется на проблеме. В реальном сценарии я должен использовать пользовательский объект.
Спасибо за предложение, но я просто попробовал, и он не сработал. Я получаю то же самое поведение. –