#c# #winforms
#c# #winforms
Вопрос:
private void button1_Click(object sender, EventAr&s e)
{
button1.AutoSize = false;
for(int i = 1; i < 100; i )
{
double sz = button1.Size.Width;
sz = sz - 1;
}
}
Я получил это, и я довольно растерян, ничего не происходит, когда я нажимаю на кнопку.
Комментарии:
1. Любой элемент управления, подобный кнопке, имеет 4 свойства 1) Левое 2) Верхнее 3) Высота 4) Ширина Размер вам не нужен.
2. Вам действительно нужно установить ширину:
button1.Width = ...
3. Ничего не происходит, потому что вы ничего не делаете с новым размером. В любом случае, даже если вы установите новую ширину кнопки в каждом цикле, вы увидите только последнюю ширину, примененную к кнопке. Изменения в интерфейсе winformsUI не происходят автоматически внутри цикла.
4. Вы пытаетесь переместить расположение кнопок или изменить размер вашей кнопки? Ваш вопрос сбивает с толку, и ваш код не работает, потому что вы не задаете никакого размера или расположения, вы только помещаете значение width в переменную..
5. @SkiSharp вы не можете. Размер — это структура. Вы не можете изменить ее на месте, см. learn.microsoft.com/en-us/dotnet/csharp/lan&ua&e-reference /…
Ответ №1:
Ваш код не работает главным образом потому, что вы не меняете размер кнопки, но помимо этого, код страдает и от другой проблемы. Видимые изменения элементов пользовательского интерфейса в WinForms выполняются (перерисовываются) только при выходе вашего кода из обработчика событий. Итак, простого изменения размера кнопки недостаточно для создания эффекта уменьшения кнопки до другого размера.
Не зная точно, каковы ваши намерения, помимо изменения размера кнопки, это может быть возможным решением. Обратите внимание на комментарии внутри этого примера.
private void button1_Click(object sender, EventAr&s e)
{
// Very important: Disable the button to avoid another click while
// you are still runnin& inside the loop
button1.Enabled = false;
for (int i = 1; i < 100; i )
{
// Chan&e the button's size
button1.Width -= 1;
// Wait for 10ms to allow the winforms en&ine to repaint the button
Task.Delay(10).Wait();
}
// Now you can reenable the button.
button1.Enabled = true;
}
Важно включить / отключить шаги кнопки, чтобы избежать повторного входа в событие click. Однако это неполно и опасно, если у вас все еще активны другие элементы управления, которые могут вызывать свои собственные события во время выполнения цикла. Такого рода графические эффекты не являются лучшими друзьями движка WinForms.
Комментарии:
1. Просто имейте в виду, что, как написано,
Task.Delay(10).Wait();
фактически БЛОКИРУЕТ поток пользовательского интерфейса. Если бы вы увеличили значение 10 до чего-то большего и попытались перетащить форму за строку заголовка во время ее выполнения, вы не получили бы ответа. Исправлением было бы перейтиasync
междуprivate
иvoid
и переключиться на использованиеawait Task.Delay(10);
. Однако, как сказал Стив, могут возникнуть другие непреднамеренные последствия для пользовательского интерфейса, когда мы начинаем иметь дело с асинхронным кодом. Вы должны быть очень внимательны в процессе проектирования…
Ответ №2:
Вот пример, иллюстрирующий мой комментарий в сообщении Стива:
Просто имейте в виду, что, как написано, задача.Delay(10).Wait(); фактически БЛОКИРУЕТ поток пользовательского интерфейса. Если бы вы увеличили значение 10 до чего-то большего и попытались перетащить форму за строку заголовка во время ее выполнения, вы не получили бы ответа. Исправлением было бы установить асинхронность между private и void и переключиться на использование await Task.Задержка (10);. Однако, как сказал Стив, могут возникнуть другие непреднамеренные последствия для пользовательского интерфейса, когда мы начинаем иметь дело с асинхронным кодом. Вы должны быть очень внимательны в процессе проектирования…
Вместо изменения размера кнопки давайте заставим ее мигать. Тогда длительность между сменой цветов будет увеличена, так что вы сможете видеть, как меняются цвета. Большее увеличение времени сделает очевидным, что форма не отвечает приведенным ниже кодом. Попробуйте перетащить форму за строку заголовка, пока кнопка мигает:
private void button1_Click(object sender, EventAr&s e)
{
button1.Enabled = false;
bool blink = false;
for (int i = 1; i < 20; i )
{
blink = !blink;
button1.BackColor = blink ? Color.Red : Control.DefaultBackColor;
Task.Delay(250).Wait();
}
button1.BackColor = Control.DefaultBackColor;
button1.Enabled = true;
}
При добавлении async
и переключении на await Task.Delay()
форма будет оставаться отзывчивой, когда кнопка мигает:
private async void button1_Click(object sender, EventAr&s e)
{
button1.Enabled = false;
bool blink = false;
for (int i = 1; i < 20; i )
{
blink = !blink;
button1.BackColor = blink ? Color.Red : Control.DefaultBackColor;
await Task.Delay(250);
}
button1.BackColor = Control.DefaultBackColor;
button1.Enabled = true;
}