2016-05-27 5 views
0

Ich stoße auf einen Fehler in meiner XAML-Anwendung.XAML Storyboard DependencyObject Fehler

Der Fehler Ich erhalte ist

'[unbekannt]' Eigenschaft verweist nicht auf einen Pfad in DependencyObject '(0). (1) [2]. (2)'.

Ich suchte herum und fand heraus, dass sich etwas in <Image.RenderTransform> Tag in Page.xaml für RotateTransform gehen muss, aber ich bin nicht sicher, was da ich XAML neu bin und immer noch lernen.

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> 

Code hinter

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 sind hier seltsam. Woher hast du das? – jHilscher

+0

@jHilscher 'TargerProperty' wird durch Blend erzeugt. Verwenden Sie 'TargetName', um den Namen zu binden, da ich ihn auf verschiedenen Bildern verwenden werde. Danke – Omar

Antwort

0

Der Fehler in diesem Teil verursacht wird:

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

Der Ereignisauslöser lädt das Storyboard nicht richtig (setzt nicht TargetName). Sie sehen also diesen Fehler.


Sie könnten den startAni Anruf in dem geladenen Ereignisse der Seite (in Code-behind.) Setzen Das ist für mich völlig in Ordnung ist:

public Page() { 

     InitializeComponent(); 

     Loaded += Page_Loaded; 

    } 

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

Eine einzige Lösung XAML würden wie folgt aussehen:

<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> 

Verwenden Sie eine TimelineCollection anstelle eines Storyboards, und Sie können TargetName in der Page.XAML-Datei festlegen. Dies benötigt keinen Code überhaupt.

Ein anderer Ansatz wäre, das Storyboard in einen Stil einzufügen und den Stil auf jedes Bild anzuwenden. Dies wäre klarer und wiederverwendbar. Sie können eine ungefähre Idee bekommen, wie man das macht here

+0

XAML Lösung arbeitete wie Charme. Ist es möglich, die Rotation im Code zu stoppen? – Omar

+0

Böse Nachfolge-Frage;) Stoppen ist nicht so einfach wie es scheint, wie hier diskutiert: http://stackoverflow.com/questions/5623601/stop-wpf-animation-storyboard-begin-in-xaml-but-stopping -im-Codebehind – jHilscher

Verwandte Themen