2011-01-27 1 views
0

Я создал пользовательский элемент управления, который имеет свойство типа 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 с сообщением: «Не удается разрешить Имя_целевого_объекта ЯК»

У кого-нибудь есть идея, почему?

Я знаю, что в этом примере я могу обойти проблему, не используя пользовательский объект и вместо этого используя другое свойство. Однако это упрощенная версия моего сценария, которая фокусируется на проблеме. В реальном сценарии я должен использовать пользовательский объект.

ответ

1

Две вещи должны быть сделаны с новым подходом:

  • В AnimationHolder класс, сделать Animation свойство свойство зависимостей, так же, как это ранее было.
  • Derive AnimationHolder класс из DependencyObject. Это необходимо, так что вы можете сделать свойство зависимостей Animation. Помните, что только классы, полученные от DependencyObject, могут определять свойства зависимостей!

Я думаю, что как только вы сделаете эти две вещи, это решит вашу проблему!

+0

Спасибо за предложение, но я просто попробовал, и он не сработал. Я получаю то же самое поведение. –

Смежные вопросы