Come posso aggiungere effetti in movimento ai miei controlli in C #?

Ho un pannello nel mio modulo C # e ho un pulsante. Quando clicco sul pulsante, il pannello invisibile mostra. Invece di quello voglio che il Pannello si muova o scorra. Ad esempio quando clicchi su una casella combinata l’elenco a discesa non compare semplicemente. Voglio che il mio Pannello appaia così. Come lo posso fare ?

L’animazione della finestra è una funzionalità integrata per Windows. Ecco una class che la usa:

using System; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; public static class Util { public enum Effect { Roll, Slide, Center, Blend } public static void Animate(Control ctl, Effect effect, int msec, int angle) { int flags = effmap[(int)effect]; if (ctl.Visible) { flags |= 0x10000; angle += 180; } else { if (ctl.TopLevelControl == ctl) flags |= 0x20000; else if (effect == Effect.Blend) throw new ArgumentException(); } flags |= dirmap[(angle % 360) / 45]; bool ok = AnimateWindow(ctl.Handle, msec, flags); if (!ok) throw new Exception("Animation failed"); ctl.Visible = !ctl.Visible; } private static int[] dirmap = { 1, 5, 4, 6, 2, 10, 8, 9 }; private static int[] effmap = { 0, 0x40000, 0x10, 0x80000 }; [DllImport("user32.dll")] private static extern bool AnimateWindow(IntPtr handle, int msec, int flags); } 

Esempio di utilizzo:

  private void button2_Click(object sender, EventArgs e) { Util.Animate(button1, Util.Effect.Slide, 150, 180); } 

Se si utilizza .NET 4 (se non si sostituisce Task with Thread), una funzione simile potrebbe essere un inizio:

  private void slideToDestination(Control destination, Control control, int delay, Action onFinish) { new Task(() => { int directionX = destination.Left > control.Left ? 1 : -1; int directionY = destination.Bottom > control.Top ? 1 : -1; while (control.Left != destination.Left || control.Top != destination.Bottom) { try { if (control.Left != destination.Left) { this.Invoke((Action)delegate() { control.Left += directionX; }); } if (control.Top != destination.Bottom) { this.Invoke((Action)delegate() { control.Top += directionY; }); } Thread.Sleep(delay); } catch { // form could be disposed break; } } if (onFinish != null) onFinish(); }).Start(); } 

Uso:

 slideToDestination(sender as Control, panel1, 10, () => MessageBox.Show("Done!")); slideToDestination(sender as Control, panel1, 0, null); 

Come azione, invierai alcune variabili booleane da impostare su true in modo che tu sappia che l’animazione è terminata o che qualche codice deve essere eseguito dopo di esso. Attenzione ai deadlock quando si chiama con un’azione nulla. Puoi eseguire due animazioni sullo stesso controllo in due direzioni diverse con la stessa velocità, e rimarrà dov’era per sempre e naturalmente due animazioni simultaneamente possono far andare il controllo infinitamente in qualche direzione perché il tempo non finirà mai 🙂

Controlla la biblioteca che ho scritto l’anno scorso:

WinForm Animation Library [.Net3.5 +]

Una semplice libreria per l’animazione di controlli / valori in. Net WinForm (.Net 3.5 e versioni successive). Fotogramma chiave (percorso) basato e completamente personalizzabile.

https://falahati.github.io/WinFormAnimation/

 new Animator2D( new Path2D(new Float2D(-100, -100), c_control.Location.ToFloat2D(), 500)) .Play(c_control, Animator2D.KnownProperties.Location); 

Questo sposta il controllo c_control da -100, -100 alla posizione in cui si trovava al primo posto in 500 ms.

Per WinForms, è ansible iniziare con la posizione del pannello sullo schermo.

Utilizza un timer e, nell’evento Tick, sposta lentamente la posizione del pannello in vista finché non raggiunge le tue coordinate predefinite.

Un sacco di modi per pelle un gatto, ma questo è come lo farei.