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
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();
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.
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
Huh? Aucun lien ne montre comment créer des contrôles semi-transparents. – MusiGenesis
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
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.
Je crois que cette réponse d'utiliser AnimateWindow est beaucoup mieux builtin à cet effet: How can I add moving effects to my controls in C#?
- 1. Événement de glissement de la fenêtre WinForms
- 2. Winforms C#: affichage efficace de nombreux contrôles
- 3. créer fondu entre 2 vidéos dans WinForms
- 4. Animation de base - Glissement de fenêtre en forme de feuille
- 5. C# winforms distribue uniformément 3 contrôles
- 6. wpf animation fondu en gel et fondu
- 7. C# Winforms PropertyGrid et ErrorProvider
- 8. Affichage des contrôles sur une forme alpha-mélangée
- 9. WinForms: nombre variable de contrôles TextBox dynamiques
- 10. WinForms Comparaison des contrôles de visualisation HTML
- 11. Lier les contrôles aux animations autonomes
- 12. UINavigationController Animations de transition personnalisées
- 13. Winforms fixe unique frontière sur commande en forme de mesure
- 14. valeur Le passage d'une forme à une autre forme (C# WinForms)
- 15. Problème de défilement et de glissement d'image
- 16. Déplacement et glissement de jQuery dans une zone de texte
- 17. MVVM, Animations et Commandement - Meilleure façon de lancer des animations?
- 18. iPhone - cocos2d - Animations et classe C++
- 19. Contrôles de bordure de tabulation C#
- 20. C# WinForms ErrorProvider Control
- 21. Création d'un contrôle de superposition sous forme de winforms
- 22. Portée C# et variable dans Winforms
- 23. Le glissement de Javascript sélectionne le texte et les éléments autour de la zone de glissement
- 24. Evénement de glissement UIView
- 25. WinForms GDI + polygonales événements et les panneaux en forme personnalisée
- 26. Enregistrer des données à partir de contrôles WinForms à une base de données SQL Server
- 27. C# WinForms UserControl Mouse Aide de l'événement
- 28. Winforms WPF Interop - contrôles WPF inactivés
- 29. Arrière-plans de contrôle transparents sur une forme dégradée VB.NET?
- 30. Bordure et fondu de bordure de tableau
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