none
Storyboard.TargetName per Codebehind ändern RRS feed

  • Frage

  • Hallo,

    Ich möchte ein universelles Storyboard erstellen, dass eine Komponente vom Typ "Grid" ausblendet und eine andere einblendet. Das ist mein Storyboard dafür, mit bereits eingestellten zielen:

    		<Storyboard x:Key="st_GoToPage">
    			<DoubleAnimationUsingKeyFrames x:Name="page_a_1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="gr_intro2">
    				<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
    					<EasingDoubleKeyFrame.EasingFunction>
    						<SineEase EasingMode="EaseIn"/>
    					</EasingDoubleKeyFrame.EasingFunction>
    				</EasingDoubleKeyFrame>
    			</DoubleAnimationUsingKeyFrames>
          <ObjectAnimationUsingKeyFrames x:Name="page_a_2" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="gr_intro2">
    				<DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Collapsed}"/>
    			</ObjectAnimationUsingKeyFrames>
          <ObjectAnimationUsingKeyFrames x:Name="page_b_1" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="gr_welcome">
    				<DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Visible}"/>
    				<DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{x:Static Visibility.Visible}"/>
    			</ObjectAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames x:Name="page_b_2" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="gr_welcome">
    				<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
    					<EasingDoubleKeyFrame.EasingFunction>
    						<SineEase EasingMode="EaseOut"/>
    					</EasingDoubleKeyFrame.EasingFunction>
    				</EasingDoubleKeyFrame>
    				<EasingDoubleKeyFrame KeyTime="0:0:1" Value="1">
    					<EasingDoubleKeyFrame.EasingFunction>
    						<SineEase EasingMode="EaseOut"/>
    					</EasingDoubleKeyFrame.EasingFunction>
    				</EasingDoubleKeyFrame>
    			</DoubleAnimationUsingKeyFrames>
    		</Storyboard>
    

    Nun möchte ich aber aus sicherlich nachvollziehbarem grund die Storyboard.TargetProperty's der einzelnen DoubleAnimationUsingKeyFrames benannt mit page_a_1 und page_b_2 sowie der ObjectAnimationUsingKeyFrames benannt mit page_a_2 und page_b_1 ändern, sodass ich je nach aufruf die entsprechenden ziele einfülle. Dies habe ich so versucht:

        private void GoToPage(Grid nextpage, Grid currentpage)
        {
          #region Setup Storyboard
          
          DoubleAnimationUsingKeyFrames page_a_1 = (DoubleAnimationUsingKeyFrames)FindResource("page_a_1");
          page_a_1.SetValue(Storyboard.TargetNameProperty, currentpage.Name);
    
          ObjectAnimationUsingKeyFrames page_a_2 = (ObjectAnimationUsingKeyFrames)FindResource("page_a_2");
          page_a_2.SetValue(Storyboard.TargetNameProperty, currentpage.Name);
    
          ObjectAnimationUsingKeyFrames page_b_1 = (ObjectAnimationUsingKeyFrames)FindResource("page_b_1");
          page_a_1.SetValue(Storyboard.TargetNameProperty, nextpage.Name);
    
          DoubleAnimationUsingKeyFrames page_b_2 = (DoubleAnimationUsingKeyFrames)FindResource("page_b_2");
          page_a_1.SetValue(Storyboard.TargetNameProperty, nextpage.Name);
    
          #endregion
    
          Storyboard thisST = (Storyboard)FindResource("st_GoToPage");
          thisST.Begin(this);
        }
    

    Aber das funktioniert nicht. Jedes mal beim testen erhalte ich eine Exception, weil die Methode "FindResource()" die jeweiligen objekte nicht finden kann (Resource not found: "page_a_1").

    Was mache ich falsch und wie kann ich das richtig machen?
    Für hilfe wäre ich sehr dankbar :)

    Grüße,

    Sonic

    Freitag, 15. April 2011 20:56

Antworten

  • Hi,

     

    teste mal folgendens:

    ...
    
    
    
    Storyboard thisST = (Storyboard)FindResource("st_GoToPage");
    
    
    
    
    
       DoubleAnimationUsingKeyFrames page_a_1 = (DoubleAnimationUsingKeyFrames)thisST.Children.Where<Timeline>(item => item.Name == "page_a_1").First<Timeline>();
    
       if (page_a_1 != null)
    
       {
    
        page_a_1.SetValue(Storyboard.TargetNameProperty, currentpage.Name);
    
       }
    
    
    
    ...

    • Als Antwort markiert SonicTTH Dienstag, 19. April 2011 08:31
    Sonntag, 17. April 2011 08:05
    Beantworter

Alle Antworten

  • Hi,

     

    teste mal folgendens:

    ...
    
    
    
    Storyboard thisST = (Storyboard)FindResource("st_GoToPage");
    
    
    
    
    
       DoubleAnimationUsingKeyFrames page_a_1 = (DoubleAnimationUsingKeyFrames)thisST.Children.Where<Timeline>(item => item.Name == "page_a_1").First<Timeline>();
    
       if (page_a_1 != null)
    
       {
    
        page_a_1.SetValue(Storyboard.TargetNameProperty, currentpage.Name);
    
       }
    
    
    
    ...

    • Als Antwort markiert SonicTTH Dienstag, 19. April 2011 08:31
    Sonntag, 17. April 2011 08:05
    Beantworter
  • Naja das sieht etwas kompliziert aus.

    Aber vielen Dank für den hinweis über die Children des Storyboards dranzukommen.
    Damit habe ich etwas rumprobiert und das hier hat funktioniert:

        private void GoToPage(Grid nextpage, Grid currentpage)
        {
          #region Setup Storyboard
    
          Storyboard thisST = (Storyboard)FindResource("st_GoToPage");
          thisST.Children[0].SetValue(Storyboard.TargetNameProperty, currentpage.Name);
          thisST.Children[1].SetValue(Storyboard.TargetNameProperty, currentpage.Name);
          thisST.Children[2].SetValue(Storyboard.TargetNameProperty, nextpage.Name);
          thisST.Children[3].SetValue(Storyboard.TargetNameProperty, nextpage.Name);
          thisST.Begin(this);
    
          #endregion
        }
    

    Also: Danke :)

    Grüße,

    Sonic

    Dienstag, 19. April 2011 08:30