2010-05-27 4 views
13

J'essaie de mettre en œuvre un moyen d'animer (traduire, fondu) les contrôles autour (plus d'un en même temps peut-être) élégamment. Par exemple, disons que j'avais une image dans le coin en haut à gauche, et une zone de texte dans le coin en bas à droite, je voudrais pouvoir les faire glisser en douceur à travers la fenêtre et changer de place. Je travaille depuis un certain temps, mais je n'ai rien trouvé qui puisse le faire facilement ou facilement.Animations: Contrôles de glissement et de fondu sur une forme C# (winforms)

Répondre

18

Découvrez le dot-net-transitions projet sur Google Code. Il y a maintenant un clone sur Github here. Il est également disponible sur nuget sous le numéro dot-net-transitions. Il prend en charge une variété de transitions linéaires/non-linéaires, y compris les transitions composites qui peuvent être utilisées pour des effets plus complexes tels que l'ondulation.

Voici un échantillon de travail qui démontre votre comportement souhaité:

var pictureBox = new PictureBox 
    { 
     ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png", 
     SizeMode = PictureBoxSizeMode.AutoSize 
    }; 
var textBox = new TextBox 
    { 
     Text = "Hello World", 
     Location = new Point(140, 140) 
    }; 
var form = new Form 
    { 
     Controls = 
     { 
      textBox, 
      pictureBox 
     } 
    }; 
form.Click += (sender, e) => 
    { 
     // swap the Left and Top properties using a transition 
     var t = new Transition(new TransitionType_EaseInEaseOut(1000)); 
     t.add(pictureBox, "Left", textBox.Left); 
     t.add(pictureBox, "Top", textBox.Top); 
     t.add(textBox, "Left", pictureBox.Left); 
     t.add(textBox, "Top", pictureBox.Top); 
     t.run(); 
    }; 
form.ShowDialog(); 
6

Je vous recommande de passer à WPF; cela rendrait beaucoup plus facile.

Il est complètement impossible de faire disparaître les contrôles dans WinForms; Les contrôles Windows ne peuvent pas avoir d'opacité. Le plus proche que vous pouvez obtenir serait de rendre le contrôle et sa zone sur le formulaire à une paire de bitmaps, puis de fondre les bitmaps dans un PictureBox en utilisant une matrice de couleurs.

Pour faire glisser les contrôles dans WinForms, vous pouvez utiliser un minuteur pour modifier progressivement les propriétés Top et/ou Left des contrôles et les déplacer dans le formulaire. Cependant, vous aurez un scintillement ennuyeux, ce qui est (AFAIK) impossible à enlever.

+1

Pour référence future: 'this.Update()' juste en dehors de la méthode de MoveControl vous créez réduire considérablement vacillante, pratiquement au point où ce n'est pas visible à moins que vous ne courez comme un milliard d'applications à la fois. – bendr

0

Enregistrer une copie de chacune des valeurs x et y des éléments sous la forme d'un flottant.

Utilisez une minuterie et, à chaque tick, ajoutez une valeur à la position x et y de l'élément supérieur gauche. Soustrayez la même valeur des x et y de l'élément inférieur droit.

Assurez-vous d'utiliser les valeurs flottantes mises en cache ici, sinon vous risquez d'obtenir des erreurs d'arrondi lorsque l'élément est déplacé sur le formulaire.

Si vous peignez sur la surface que vous utilisez pour les images/contrôles, annulez-la pour chaque tick.

Devrait être facile-peasy.

Edit:

Pour les contrôles transparents, consultez Conseils de Bob Powell & Tricks:

http://www.bobpowell.net/transcontrols.htm

Et voici sa réponse sur la façon de faire des contrôles semi-transparents:

http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

+0

Huh? Aucun lien ne montre comment créer des contrôles semi-transparents. – MusiGenesis

+0

Le premier lien est un excellent tutoriel sur la façon de créer des contrôles entièrement transparents. Le deuxième lien est une brève discussion sur la façon dont vous pouvez créer des contrôles semi-transparents en utilisant votre propre peinture personnalisée avec des pinceaux avec une valeur alpha. Il mentionne également la mise en garde que ce genre de solution pourrait provoquer un scintillement. Bob Powell suggère en outre qu'un tel contrôle pourrait être réalisé en utilisant l'API LayeredWindow. Dans tous les cas, en fonction des besoins de Tommy, cela peut être difficile dans WinForms. – Pedery

1

Vous pourrait faire en WinForms, avec beaucoup d'efforts, donc je dois seconder les recommandations à utiliser WPF (qui est essentiellement construit pour exactement ce genre de chose). Votre principal obstacle dans WinForms est le fait qu'un emplacement de contrôle est spécifié par un entier, ce qui signifie que vous ne pouvez pas définir la propriété d'un contrôle sur 45.3425, par exemple.Cela rend l'animation des contrôles (en supposant que vous voulez un mouvement qui change les vitesses et les directions) complètement impossible - vous obtiendrez ainsi un mouvement saccadé inévitable (j'ai essayé, donc je sais). Comme SLaks l'a suggéré, la seule façon de faire cela dans WinForms serait de le "fausser" en prenant des "snapshots" de chaque contrôle. Fondamentalement, vous commencerez avec un Bitmap invisible de la taille de votre formulaire, dessiné avec BackColor du formulaire. Vous devez ensuite créer les «instantanés» en appelant DrawToBitmap() sur chaque contrôle que vous souhaitez animer et créer l'effet de mouvement en dessinant les instantanés sur le canevas (System.Drawing peut dessiner des images avec des coordonnées en virgule flottante, évitant ainsi les sauts de nombres entiers).

C'est trop de sacrément bon travail, cependant. Utilisez simplement WPF. :)

Edit: Je dois mentionner que c'est en fait facile de faire quelque chose comme ça dans WinForms, aussi longtemps que vous ne me dérange pas regarder terrible et saccadé et amateurisme. Mes commentaires ci-dessus se réfèrent aux difficultés de faire cela bien.

Questions connexes