Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Анимация разворачивания [Решено]

PreviousPage 2 of 2
//Свернуть
button1.Click += async (s, a) => 
{ 
    while (Opacity > 0) 
    { 
        Opacity -= 0.2; 
        Height -= 10; 
        Width -= 10; 
        Location = new Point(Location.X - 25, Location.Y + 35); 
        await Task.Delay(1); 
    };
    WindowState = FormWindowState.Minimized; 
};

//Развернуть
SizeChanged += async(s, a) => 
{  

    if (WindowState == FormWindowState.Minimized && Opacity <= 0)
    {
        while (Opacity < 100) 
        { 
            Opacity += 0.2; 
            Height += 10; 
            Width += 10; 
            Location = new Point(Location.X + 25, Location.Y - 35);
            await Task.Delay(1); 
        }
        WindowState = FormWindowState.Normal;
    }
};

 

У Тебя тут сразу несколько конфликтов. Ты вроде бы посылаешь СкопированоWindowState = FormWindowState.Minimized в конце метода сворачивания, и это правильно. Однако, в самом методе у Тебя есть изменения свойств СкопированоWidth и СкопированоHeight, на что и реагирует СкопированоSizeChanged. Он ведь постоянно меняется в цикле по кнопке =)

У Тебя в условии Opacity == 100, а должен быть 1.
Это на WPF 100, на Windows Forms = 1.


Чтобы избежать пересечения методов Тебе придётся объявить два поля:

bool minimized;
bool normal;

Код для кнопки сворачивания должен сначала делать Скопированоdo, а потом проверять Скопированоwhile.
У Тебя сначала проверяет, потом делает. Нет. Если юзер начал сворачивать, значит надо сворачивать.
И уже потом проверять.


Код для сворачивания:

button1.Click += async (s, a) =>
{
    do
    {
        Opacity -= 0.2;
        Height -= 10;
        Width -= 10;
        Location = new Point(Location.X - 25, Location.Y + 35);
        await Task.Delay(1);
    }
    while (Opacity > 0);
    WindowState = FormWindowState.Minimized;
    minimized = true;
};

Код для разворачивания:

// SizeChanged писать дольше, поэтому Resize =)
Resize += async (s, a) =>
{
    if (minimized && !normal)
    {
        // А вот тут уже можно и while без do
        while (Opacity < 1)
        {
            // Именно тут normal должен стать = true, чтобы Resize не забежал сюда снова
            normal = true;
            Opacity += 0.2;
            // Поднимаем обратный шаг на 20%, потому что в самый нужный раз он не зайдёт
            Height += 12;
            Width += 12;
            Location = new Point(Location.X + 25, Location.Y - 35);
            await Task.Delay(1);
        }
        WindowState = FormWindowState.Normal;
        minimized = false;
        normal = false;
    }
    // Для перерисовки, если форма разукрашивается
    // Invalidate();
};
Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
Удаленный пользовательУдаленный пользователь

Спасибо большое.

PreviousPage 2 of 2