programing learn Ответов: 2

Winform дважды щелкните событие на панели не работает


Привет.
Я пишу приложение WinForm на языке C#.
Я пытаюсь запустить событие двойного щелчка панели, содержащей метки, кнопки.
Но событие не происходит из-за элементов в панели (метка, кнопка и т. д.).

Я хочу сгенерировать событие двойного щелчка везде, где я нажимаю в любом месте, кроме кнопки.

как я могу запустить событие двойного щелчка?

спасибо

Что я уже пробовал:

class Test : UserControl
{
  public Test()
  {
    InitializeComponent();
    this.DoubleClick += doublbCli;
  }

  private void doublbCli(object sender, EventArgs e)
  {
    MessageBox.Show("info");
  }
}

2 Ответов

Рейтинг:
14

OriginalGriff

Это не обработка двойного щелчка на панели - это обработка двойного щелчка на UserControl. Если ваш элемент управления содержит панель, которая заполняет всю область, то панель получит событие двойного щелчка, а не ваш элемент управления.
Два способа исправить это:
1) обработайте событие панели:

this.DoubleClick += doublbCli;
Становится:
myPanel.DoubleClick += doublbCli;

2) Снимите панель. UserControl уже является контейнером, и вам, вероятно, не нужна панель, заполняющая эту область, - просто поместите элементы управления непосредственно на поверхность управления.


programing learn

спасибо
Однако событие двойного щелчка по-прежнему не происходит в области метки.
Добавление события двойного щелчка в область меток работает нормально.
однако что делать, если у меня много ярлыков?

OriginalGriff

Этого не будет. Простая причина заключается в том, что события мыши работают от самого высокого до самого низкого уровня в "стеке управления" (где форма является самой низкой), ища элемент управления, который может справиться с этим. Поскольку все элементы управления могут обрабатывать все события мыши, самое высокое в стеке получает событие, и это предотвращает его дальнейшее "снижение".

Если вы хотите, чтобы все (за исключением нескольких) элементы управления обрабатывали двойной щелчок одинаково, то вам нужно добавить обработчик к каждому из них (вы можете перебирать коллекцию элементов управления в конструкторе и рассматривать свою кнопку как особый случай, который не будет добавлен).

programing learn

спасибо

OriginalGriff

Всегда пожалуйста!

Рейтинг:
11

Maciej Los

В дополнение к решению №1 от OriginalGriff...

class Test : UserControl
{
  public Test()
  {
    InitializeComponent();
    panel1.DoubleClick  += doublbCli;
    foreach(Control c in panel1.Controls)
    {
        if(!c is Button)
            c.DoubleClick += doublbCli;
    }
  }

  private void doublbCli(object sender, EventArgs e)
  {
    MessageBox.Show("info");
  }
}


Для получения более подробной информации, пожалуйста, смотрите: Операторы тестирования типов и приведения - Справочник по C# | Microsoft Docs[^]