37 votes

À l'aide d'un Storyboard d'animation sur un par programmation-contrôle

Je suis en train de faner dans une nouvelle télécommande pour mon application "app" de la zone qui est en programmant ajoutés après les contrôles existants sont supprimés. Mon code ressemble à ceci:

    	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();
	}

Cependant, lorsque j'exécute ce code, j'obtiens l'erreur "Non applicable nom du champ d'application existe pour résoudre le nom de "settingsPane'."

Que suis-je bien fais de mal? Je suis assez sûr que j'ai enregistré tout correctement :(

60voto

juliekoubova Points 1760

Je n'aurais pas de soucis avec les portées de nom etc. et serait plutôt d'utiliser le Storyboard.SetTarget à la place.

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();

12voto

Carlos Angulo Points 61

J'ai résolu le problème à l'aide de ce paramètre dans la méthode, essayez:

sb.Commencer(ce);

Parce que le nom est inscrit dans la fenêtre.

5voto

Cheeso Points 87022

Je suis d'accord, les portées de nom sont probablement pas la bonne chose à utiliser pour ce scénario. Beaucoup plus simple et plus facile à utiliser SetTarget plutôt que SetTargetName.

Dans le cas où il aide à quelqu'un d'autre, voici ce que j'ai utilisé pour mettre en surbrillance une cellule dans un tableau avec une évidence qui se désintègre à rien. C'est un peu comme la StackOverflow en surbrillance lorsque vous ajoutez un nouvel élément de réponse.

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

0voto

Clark Kent Points 5845

Il est possible bizarre mais ma solution est d'utiliser les deux méthodes:

Storyboard.SetTargetName(DA, myObjectName);

Storyboard.SetTarget(DA, myRect);

sb.Begin(this);

Dans ce cas, il n'y a pas d'erreur.

Jetez un oeil à l'endroit du code où je l'ai utilisé.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X