locked
Storyboard im Code anlegen und zuweisen RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem, dass ich mir nicht genau erklären kann. Ich möchte einem UIElement ein Storyboard zuweisen (Silverlight 4). Das Element und das Storyboard sollen per Code erstellt und zugewiesen werden.

    Dazu habe ich folgenden Code, wo das UIElement (PolFotHyperlinkButton von HyperlinkButton abgeleitet) erstellt wird.

    foreach (NavigationElement ne in n.NaviElements)
              {
                /*...*/
                //Create HyperlinkButton with predefined styles
                PolFotHyperlinkButton h = new PolFotHyperlinkButton(ne);
                //bind storyboard to HyperlinkButton
                ne.SetStoryboardTarget(h);
                /*...*/
              }
    

    Das NavigationElement und PolFotHyperlinkButton entsprechen einander. Das eine ist meine C# Klasse und das andere das UIElement im Silverlight. Die Funktion SetStoryboardTarget enthält folgenden Code:

            storyboardMouseEnter = new Storyboard();
            DoubleAnimation da = new DoubleAnimation();
            da.To = 0.2;
            da.Duration = new Duration(new TimeSpan(0, 0, 0, 2));
            Storyboard.SetTarget(da, (elem as PolFotHyperlinkButton));
            Storyboard.SetTargetName(da, "Opacity");
            storyboardMouseEnter.Children.Add(da);
    
            storyboardMouseLeave = new Storyboard();
            da = new DoubleAnimation();
            da.To = 1.0;
            da.Duration = new Duration(new TimeSpan(0, 0, 0, 2));
            Storyboard.SetTarget(da, (elem as PolFotHyperlinkButton));
            Storyboard.SetTargetProperty(da, new PropertyPath("Opacity"));
            storyboardMouseLeave.Children.Add(da);
    

    Ich habe dort also zwei Storyboards, die ich bei der Initialisierung der App mit Werten fülle. Anschließend füge ich dem PolFotHyperlinkButton noch zwei EventHandler hinzu, die die Storyboards starten. Das heißt: Der PolFotHyperlinkButton ruft im NavigationElement, das sein Pendant ist, das Storyboard auf und startet es. Beim Start des Storyboards wird mir aber folgender Fehler ausgegeben:

    Animationsziel nicht festgelegt.

    Bei der Zuweisung erscheint aber kein Fehler. Kann mir jemand helfen?

    Montag, 1. August 2011 09:37

Alle Antworten

  • Alternativ habe ich die Storyboards in ein Dictionary gelegt. Dann funktioniert die Zuweisung. Allerdings funktioniert die Animation nicht korrekt. Ich habe vier PolFotHyperlinkButton und wenn ich mit der Maus über einen gehe, sollen die anderen ausgegraut werden.

    Ich habe mir daher eine Schleife gebaut, die durch die vier Elemente iteriert und alle Elemente ausgraut die nicht die ID des Elements haben, auf dem die Maus ist. Das Verhalten ist das, dass das letzte Element nur ausgegraut wird. Vielleicht weil es zu letzt erstellt wurde und das Storyboard auf Grund der Deklaration im XAML nur für ein Element gelten kann? Kann mir jemand helfen?

    Code ist wie folgt in der alternativen SetStoryboardTarget:

    public bool SetStoryboardTarget(UIElement elem)
        {
          try
          {
            storyboardMouseEnter = App.Current.Resources["navi_FadeOut"] as Storyboard;
            Storyboard.SetTarget(storyboardMouseEnter.Children[0] as DoubleAnimation, elem);
    
            storyboardMouseLeave = App.Current.Resources["navi_FadeIn"] as Storyboard;
            Storyboard.SetTarget(storyboardMouseLeave.Children[0] as DoubleAnimation, elem);
    
            return true;
          }
          catch { return false; }
        }
    


    Eventhandler zum Ausgrauen:

    public void NavigationElementEntered(PolFotHyperlinkButton element)
        {
          ///Navigation element is entered by mouse
          ///need to find Navigation within this element
          ///prove if this is the current navigation
          ///start storyboard to all other elements within this navigation
          Navigation n = this.GetNavigationByContainingElementId(element.Name);
          if (n.IsCurrentNavigation)
          {
            foreach (NavigationElement elem in n.NaviElements)
              if (elem.Id != element.Name)
                elem.BeginFadeOut();
          }
        }
    


    Storyboard in der XAML:

    <ResourceDictionary
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
      <Storyboard x:Key="navi_FadeOut">
        <DoubleAnimation Duration="0:0:0.2" To="0.2" Storyboard.TargetProperty="Opacity"/>
      </Storyboard>
      <Storyboard x:Key="navi_FadeIn">
        <DoubleAnimation Duration="0:0:0.2" To="1.0" Storyboard.TargetProperty="Opacity"/>
      </Storyboard>
    </ResourceDictionary>
    
    

    Montag, 1. August 2011 09:58