БлогNot. С# Windows Forms: как избавиться от повторных кликов...

С# Windows Forms: как избавиться от повторных кликов...

По просьбам трудящихся. Как сделать, чтобы до завершения процесса (например, перемещения картинки по форме) повторный выбор элементов интерфейса был недоступен?

Просто выключить свойство Enabled может оказаться недостаточно - по завершении периода неактивности кнопка (или другой элемент интерфейса) "вспомнят всё" и обработают клики из очереди. Не помогают и глобальные флаги в обработчиках событий по принципу

int cnt = 1;
bool busy = false;
//...
private void button1_Click (object sender, EventArgs e) {
 if (busy) return;
 busy = true;
 //Вычислительный процесс, мы к нему добавляем задержку
 textBox1.AppendText ("Строка " + (cnt++) + Environment.NewLine);
 Thread.Sleep (3000);
 busy = false;
}

Предположим, что на форме расположены кнопка button1 и многострочное текстовое поле textBox1.

Вариант 1. Application.DoEvents - может приводить к непредсказуемому поведению с ростом сложности приложения.

using System;
using System.Threading;
using System.Windows.Forms;

namespace Delay1 {
 public partial class Form1 : Form {
  int cnt = 1;
  public Form1 () {
   InitializeComponent ();
  }

  private void button1_Click (object sender, EventArgs e) {
   button1.Enabled = false;
   //Вычислительный процесс, мы к нему добавляем задержку
   textBox1.AppendText ("Строка " + (cnt++) + Environment.NewLine);
   Thread.Sleep (3000);
   Application.DoEvents ();
   button1.Enabled = true;
  }
 }
}

Вариант 2. Применить async и await. Если в async-методе, в том числе, в обработчике события, "один вход и один выход", это должно работать стабильно.

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Delay1 {
 public partial class Form1 : Form {
  int cnt = 1;
  public Form1 () {
   InitializeComponent ();
  }
  private async void button1_Click (object sender, EventArgs e) {
   button1.Enabled = false;
   textBox1.AppendText ("Строка " + (cnt++) + Environment.NewLine);
   await Task.Delay (3000);
   button1.Enabled = true;
  }
 }
}

 Скачать пример 2 в архиве .zip с проектом Visual Studio 2019 и выше, развернуть в новую папку (11 Кб)

14.05.2024, 21:11 [234 просмотра]


теги: программирование c# время

К этой статье пока нет комментариев, Ваш будет первым