2016-05-27 3 views
0

Я встречаюсь с ошибкой в ​​своем приложении XAML.XAML Storyboard DependencyObject Error

Ошибка я получаю это

'[Unknown] свойство не указывает на DependencyObject в пути ' (0). (1) [2]. (2).

Я искал вокруг и обнаружил, что что-то должно пойти внутри <Image.RenderTransform> тег в Page.xaml для RotateTransform, но я не уверен, что так как я новичок в XAML и все еще учусь.

app.xaml

<Storyboard x:Key="spin"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" 
              Storyboard.TargetName="{Binding}" 
              RepeatBehavior="Forever"> 
       <EasingDoubleKeyFrame KeyTime="0:0:1" 
             Value="360"/> 
      </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

Page.xaml

<Page.Triggers> 
     <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
      <BeginStoryboard Storyboard="{DynamicResource spin}"/> 
     </EventTrigger> 
</Page.Triggers> 

<Image x:Name="image1" 
     Margin="0, 0, 5, 0" 
     Source="{StaticResource inProcessImage}" 
     Width="18" 
     RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform/> 
      <SkewTransform/> 
      <RotateTransform/> 
      <TranslateTransform/> 
     </TransformGroup> 
    </Image.RenderTransform> 
</Image> 

<Image x:Name="image2" 
     Margin="0, 0, 5, 0" 
     Source="{StaticResource inProcessImage}" 
     Width="18" 
     RenderTransformOrigin="0.5,0.5"> 
    <Image.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform/> 
      <SkewTransform/> 
      <RotateTransform/> 
      <TranslateTransform/> 
     </TransformGroup> 
    </Image.RenderTransform> 
</Image> 

Код За

startAni("spin", image1.Name); 
startAni("spin", image2.Name); 

void startAni(string storyboardName, string objectName) 
{ 
    Storyboard sb = FindResource(storyboardName) as Storyboard; 

    foreach (var child in sb.Children) 
     Storyboard.SetTargetName(child, objectName); 

    sb.Begin(this); // do not forget the this keyword 
} 
+0

Storyboard.TargetProperty + TargetName странные. Откуда вы это взяли? – jHilscher

+0

@jHilscher 'TargerProperty' генерируется смешиванием. Использование 'TargetName' для привязки имени, поскольку я буду использовать его на разных изображениях. Спасибо – Omar

ответ

0

Ошибка вызвана этой части:

<Page.Triggers> 
     <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
      <BeginStoryboard Storyboard="{DynamicResource spin}"/> 
     </EventTrigger> 
</Page.Triggers> 

Событие Trigger не загружает раскадровку должным образом (не устанавливает TargetName). Таким образом, вы видите эту ошибку.


Вы можете поставить startAni вызов в загруженном случае страницы (в коде позади.) Это работало прекрасно для меня:

public Page() { 

     InitializeComponent(); 

     Loaded += Page_Loaded; 

    } 

    private void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     startAni("spin", image1.Name); 
     startAni("spin", image2.Name); 
    } 

XAML только решение будет выглядят так:

<TimelineCollection x:Key="Ani"> 
      <DoubleAnimationUsingKeyFrames 

       Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" 
              Storyboard.TargetName="{Binding}" 
              RepeatBehavior="Forever"> 
       <EasingDoubleKeyFrame KeyTime="0:0:1" 
             Value="360"/> 
      </DoubleAnimationUsingKeyFrames> 
</TimelineCollection> 

Используйте TimelineCollection вместо раскадровки, тогда вы можете установить TargetName в Page.XAML. Это вовсе не требует кода.

<EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
    <BeginStoryboard> 
     <Storyboard TargetName="image1" Children="{DynamicResource Ani}" /> 
    </BeginStoryboard> 
    <BeginStoryboard> 
     <Storyboard TargetName="image2" Children="{DynamicResource Ani}" /> 
    </BeginStoryboard> 
</EventTrigger> 

Другим подходом было бы сделать раскадровку внутри стиля и применить стиль к каждому изображению. Это было бы более ясным и более многоразовым. Вы можете получить общее представление, как это сделать. here

+0

Решение XAML работает как шарм. Можно ли остановить поворот в коде? – Omar

+0

Зловещий вопрос о продолжении;) Остановка не так проста, как кажется, как описано здесь: http://stackoverflow.com/questions/5623601/stop-wpf-animation-storyboard-begin-in-xaml-but-stopping -это-в-код – jHilscher

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