Как добавить движущие эффекты к моим элементам управления на C #?

У меня есть панель в моей форме C #, и у меня есть кнопка. Когда я нажимаю на кнопку, отображается невидимая панель. Вместо этого я хочу, чтобы панель перемещалась или включалась. Например, когда вы нажимаете на combobox, выпадающий список просто не появляется. Я хочу, чтобы моя панель выглядела так. Как я могу это сделать ?

    Оконная анимация – это встроенная функция для Windows. Вот class, который его использует:

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

    Использование образца:

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

    Если вы используете .NET 4 (если не заменить Task with Thread), функция, подобная этой, может быть запущена:

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

    Применение:

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

    В качестве действия вы отправили бы некоторую логическую переменную в значение true, чтобы вы знали, что анимация закончена, или какой-то код для запуска после нее. Остерегайтесь взаимоблокировок при вызове с нулевым действием. Вы можете запускать две анимации на одном и том же элементе управления в двух разных направлениях с одинаковой скоростью, и он останется там, где он был навсегда, и, конечно, две анимации одновременно могут заставить управление идти бесконечно в каком-то направлении, потому что время никогда не закончится 🙂

    Посмотрите библиотеку, которую я написал в прошлом году:

    WinForm Animation Library [.Net3.5 +]

    Простая библиотека для анимации элементов управления / значений в .Net WinForm (.Net 3.5 и более поздних версиях). Основной кадр (Path) основан и полностью настраивается.

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

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

    Это перемещает c_control управления c_control с -100, -100 на место, где оно было на первом месте за 500 мс.

    Для WinForms вы можете начать с местоположения Panel вне экрана.

    Используйте таймер, а в событии «Tick» медленно перемещайте местоположение панели в поле зрения до тех пор, пока оно не будет в ваших предопределенных координатах.

    Множество способов скинуть кошку, но я так и сделаю.

    Давайте будем гением компьютера.