2009-03-30 5 views
35

Ich versuche ein neues Steuerelement in den Anwendungsbereich meiner Anwendung einzufügen, das programmgesteuert hinzugefügt wird, nachdem die vorhandenen Steuerelemente entfernt wurden. Mein Code sieht wie folgt aus:Verwenden einer Storyboard-Animation für ein programmgesteuert hinzugefügtes Steuerelement

 void settingsButton_Clicked(object sender, EventArgs e) 
    { 
     ContentCanvas.Children.Clear(); 

     // Fade in settings panel 
     NameScope.SetNameScope(this, new NameScope()); 

     SettingsPane s = new SettingsPane(); 
     s.Name = "settingsPane"; 

     this.RegisterName(s.Name, s); 
     this.Resources.Add(s.Name, s); 

     Storyboard sb = new Storyboard(); 

     DoubleAnimation settingsFade = new DoubleAnimation(); 
     settingsFade.From = 0; 
     settingsFade.To = 1; 
     settingsFade.Duration = new Duration(TimeSpan.FromSeconds(0.33)); 
     settingsFade.RepeatBehavior = new RepeatBehavior(1); 
     Storyboard.SetTargetName(settingsFade, s.Name); 
     Storyboard.SetTargetProperty(settingsFade, new PropertyPath(UserControl.OpacityProperty)); 

     ContentCanvas.Children.Add(s); 

     sb.Children.Add(settingsFade); 
     sb.Begin(); 
    } 

Allerdings, wenn ich diesen Code ausführen, erhalte ich die Fehlermeldung „Keine gültigen Namensbereich existiert der Name‚settingsPane‘zu lösen.“

Was mache ich möglicherweise falsch? Ich bin mir ziemlich sicher, dass ich alles richtig registriert habe :(

Antwort

57

ich mit dem NameScopes nicht usw. Ärger und würde eher Storyboard.SetTarget stattdessen verwenden.

var b = new Button() { Content = "abcd" }; 
stack.Children.Add(b); 

var fade = new DoubleAnimation() 
{ 
    From = 0, 
    To = 1, 
    Duration = TimeSpan.FromSeconds(5), 
}; 

Storyboard.SetTarget(fade, b); 
Storyboard.SetTargetProperty(fade, new PropertyPath(Button.OpacityProperty)); 

var sb = new Storyboard(); 
sb.Children.Add(fade); 

sb.Begin(); 
+1

Ich habe Probleme mit dieser Antwort bekommen, weil wir .NET 3.0 zielen; Obwohl SetTarget zu .NET 3.0 SP2 hinzugefügt wurde, ist dies nur mit dem .NET 3.5-Installationsprogramm möglich. Wenn Sie also .NET 3.0 SP1 unterstützen möchten, musste ich die Lösung von Carlos verwenden, um zu "sb.Begin (this)" zu wechseln. –

+1

[Hier ist eine Frage] (http://stackoverflow.com/questions/13217221/settarget-vs-registername-settargetname), die einen Fall veranschaulicht, in dem 'SetTarget' nicht funktioniert und das' RegisterName'/'SetTargetName'-Kombinationsfeld ist notwendig. – dharmatech

+1

Toller Job ... Gut –

5

Ich bin damit einverstanden, sind die namescopes wahrscheinlich die falsche Sache für dieses Szenario zu verwenden. Viel einfacher und einfacher SetTarget anstelle von SetTargetName zu verwenden.

Falls es jemand anderem hilft, hier ist, was ich verwendete, um eine bestimmte Zelle in einer Tabelle mit einem Highlight hervorzuheben, das zu nichts abfällt Es ist ein wenig wie die StackOverflow-Hervorhebung, wenn Sie eine neue Antwort hinzufügen:

TableCell cell = table.RowGroups[0].Rows[row].Cells[col]; 

    // The cell contains just one paragraph; it is the first block 
    Paragraph p = (Paragraph)cell.Blocks.FirstBlock; 

    // Animate the paragraph: fade the background from Yellow to White, 
    // once, through a span of 6 seconds. 

    SolidColorBrush brush = new SolidColorBrush(Colors.Yellow); 
    p.Background = brush; 
    ColorAnimation ca1 = new ColorAnimation() 
    { 
      From = Colors.Yellow, 
      To = Colors.White, 
      Duration = new Duration(TimeSpan.FromSeconds(6.0)), 
      RepeatBehavior = new RepeatBehavior(1), 
      AutoReverse = false, 
    }; 

    brush.BeginAnimation(SolidColorBrush.ColorProperty, ca1); 
11

ich das Problem mit diesem als Parameter in dem Verfahren beginnen gelöst, versuchen:

sb.Begin(this); 

Da der Name im Fenster eingetragen ist.

+0

Vielen Dank, dieser sehr sehr nützliche Tipp löste mein Problem auch – Tobias

+0

+1 Es löste genau das Problem, ohne etwas neues programmieren zu müssen. – Sonhja

+0

Da mein Storyboard in app.xaml-Ressourcen definiert war, musste ich den Parameter als SB.Begin (App.Current.MainWindow) hinzufügen; – Chandru

0

Es ist möglich, seltsame Sache, aber meine Lösung ist, beide Methoden zu verwenden:

Storyboard.SetTargetName(DA, myObjectName); 

Storyboard.SetTarget(DA, myRect); 

sb.Begin(this); 

In diesem Fall gibt es kein Fehler ist.

Schauen Sie sich den Code an, wo ich ihn benutzt habe.

int n = 0; 
     bool isWorking; 
     Storyboard sb; 
     string myObjectName; 
     UIElement myElement; 

     int idx = 0; 

     void timer_Tick(object sender, EventArgs e) 
     { 
      if (isWorking == false) 
      { 
       isWorking = true; 
       try 
       { 
         myElement = stackObj.Children[idx]; 

        var possibleIDX = idx + 1; 
        if (possibleIDX == stackObj.Children.Count) 
         idx = 0; 
        else 
         idx++; 

        var myRect = (Rectangle)myElement; 

        // Debug.WriteLine("TICK: " + myRect.Name); 

        var dur = TimeSpan.FromMilliseconds(2000); 

        var f = CreateVisibility(dur, myElement, false); 

        sb.Children.Add(f); 

        Duration d = TimeSpan.FromSeconds(2); 
        DoubleAnimation DA = new DoubleAnimation() { From = 1, To = 0, Duration = d }; 

        sb.Children.Add(DA); 
        myObjectName = myRect.Name; 
        Storyboard.SetTargetName(DA, myObjectName); 
        Storyboard.SetTarget(DA, myRect); 

        Storyboard.SetTargetProperty(DA, new PropertyPath("Opacity")); 

        sb.Begin(this); 

        n++; 
       } 
       catch (Exception ex) 
       { 
        Debug.WriteLine(ex.Message + " " + DateTime.Now.TimeOfDay); 
       } 

       isWorking = false; 
      } 
     } 
Verwandte Themen