Анимация разворачивания [Решено]
Цитата: Удаленный пользователь от 29.10.2021, 13:00//Свернуть 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; } };
//Свернуть
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;
}
};
Цитата: admin от 29.10.2021, 13:22У Тебя тут сразу несколько конфликтов. Ты вроде бы посылаешь
WindowState = FormWindowState.Minimizedв конце метода сворачивания, и это правильно. Однако, в самом методе у Тебя есть изменения свойствWidthиHeight, на что и реагируетSizeChanged. Он ведь постоянно меняется в цикле по кнопке =)
У Тебя тут сразу несколько конфликтов. Ты вроде бы посылаешь СкопированоWindowState = FormWindowState.Minimized в конце метода сворачивания, и это правильно. Однако, в самом методе у Тебя есть изменения свойств СкопированоWidth и СкопированоHeight, на что и реагирует СкопированоSizeChanged. Он ведь постоянно меняется в цикле по кнопке =)
Цитата: admin от 29.10.2021, 14:33У Тебя в условии 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(); };
У Тебя в условии 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();
};
Цитата: Удаленный пользователь от 04.11.2021, 23:19Спасибо большое.
Спасибо большое.