0

столкнулся со следующей проблемой - имеется выдвигающаяся panel1, которая изменяет положение при событии Hover от y: 1000, x:0 кy: 1000, x:400, это функцию я спокойно реализовал (используя таймер), но потом решил добавить возможность закреплять панель (на 1000:400) при помощи radiobutton, но у меня не получилось (Все это происходит на WinForm, к слову). Буду рад любой помощи.

private void panel2_MouseHover(object sender, EventArgs e) 
{ 
 timer1.Start(); 
} 
private void timer1_Tick(object sender, EventArgs e) 
{ 
 panel1.Height += 10; 
 if ( panel1.Height > panel2.Height) 
 timer1.Stop(); 
} 
Tanatoz
  • 45
  • "закреплять панель" - чтобы она оставалась на одном месте и event Hover был в состоянии disable. – Tanatoz May 21 '21 at 15:42
  • 1
    Предлагаете представить мысленно ваш код, найти в нем проблему и подсказать решение? :) – tym32167 May 21 '21 at 16:02
  • Просто оставлю это здесь: движок для анимации. – aepot May 21 '21 at 16:57
  • @tym32167, Ах да точно, код. Наклипа по быстрому, ибо не дома, но код в программе аналогичен. ` private void panel2_MouseHover(object sender, EventArgs e) {
            timer1.Start();
        }
    
        private void timer1_Tick(object sender, EventArgs e)
        {
            panel1.Height += 10;
    
            if ( panel1.Height > panel2.Height)
                timer1.Stop();
        }
    

    `

    – Tanatoz May 21 '21 at 17:25
  • Простите, не знаю как нормально отформатировать код в комментариях... – Tanatoz May 21 '21 at 17:26
  • 1
    Код вставьте прямо в вопрос, его можно редактировать – aepot May 21 '21 at 18:13

2 Answers2

0

Я использую в данном примере асинхронную задержку Delay(Время задержки в миллисекундах) для изменения размера Panel. Исходя из вопроса вы изменяете размер panel1 равному размеру panel2. Отметьте мой ответ если я вам помог.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Panel_Animation { public partial class Form1 : Form { Panel panel_animatoin; public Form1() { InitializeComponent(); }

    private void Form1_Load(object sender, EventArgs e)
    {
        panel_animatoin = new Panel { Parent = this, Location = new Point(3, 3), Size = new Size(100, 100), BackColor = Color.DarkGray }; // Создаю панель
        panel_animatoin.MouseHover += panel_animatoin_MouseHover; // Объявляю свойство MouseHover для панели
    }

     async void Animation_Async()
    {
        int Width = panel2.Size.Width; // Можно увеличить размер так: +10;
        int Height = panel2.Size.Height; // Можно увеличить размер так: +10;
        while (panel_animatoin.Size.Width <= Width) // Цикл будет выполняться пока ширина панели не станет равна Width 
        {
            await Task.Delay(1); // Задержка в миллисекундах
            panel_animatoin.Size = new Size(panel_animatoin.Width + 1, panel_animatoin.Size.Height); // Изменение ширины(X) Panel

        }
        while (panel_animatoin.Size.Height <= Height) // Цикл будет выполняться пока высота панели не станет равна Height 
        {
            await Task.Delay(1); // Задержка в миллисекундах
            panel_animatoin.Size = new Size(panel_animatoin.Width, panel_animatoin.Size.Height +1);// Изменение высоты(Y) Panel
        }
    }

    private void panel_animatoin_MouseHover(object sender, EventArgs e)
    {
        Animation_Async();
    }
}

}

xellan
  • 560
  • 3
  • 11
0

Для примера я изменяю сначала ширину panel, затем высоту, если вы хотите изменять одновременно ширину и высоту вы можете использовать один цикл

 async void Animation_Async()
        {
            int Width = panel2.Size.Width + 10;
            int Height = panel2.Size.Height + 10;
            while (panel_animatoin.Size.Width <= Width && panel_animatoin.Size.Width <= Height) // Цикл будет выполняться пока ширина панели не станет равна Width 
            {
                await Task.Delay(1); // Задержка в миллисекундах
                panel_animatoin.Size = new Size(panel_animatoin.Width + 1, panel_animatoin.Size.Height + 1); // Изменение ширины(X) Panel
        }
    }

xellan
  • 560
  • 3
  • 11