Control.Leave запускается MouseDown, а не MouseUp - PullRequest
1 голос
/ 06 марта 2011

У меня есть C # .NET WinForm.В форме я разрешаю пользователю добавить элемент в ListView, дважды щелкнув в ListView.Это добавляет элемент управления TextBox в ListView и помещает курсор в TextBox, чтобы пользователь мог печатать.

Я обнаружил, что пользователь сделал с элементом двумя способами (например, нажатием Enter, Esc,Tab ...), но также когда они оставляют (TextBox.Leave) TextBox.

Проблема заключается в следующем наборе шагов:

  1. Пользователь запускает TextBox.Leave, проводя мышью внизза пределами TextBox.
  2. Я добавляю новый элемент в ListView.
  3. Я выбираю новый элемент в ListView.
  4. При наведении мыши появляется новый элемент, которыйЯ только что выбрал, теряет фокус и не выбирается.

Я хотел бы, чтобы TextBox.Leave запускался MouseUp, а не MouseDown.Как мне это сделать?

Редактировать: Коди предлагает использовать свойство ListView.LabelEdit.Вот мои результаты, пытаясь это сделать:

listView_DoubleClick(...) {
  listView.LabelEdit = true;
  if(double clicked on existing listViewItem) {
     listViewItem.BeginEdit();  //this works as expected
  } else {
     var newItem = listView.Items.Add("");
     newItem.BeginEdit();       //this doesn't work, see below  
  }
}

Вызов newItem.BeginEdit () работает только тогда, когда пользователь дважды щелкает, где новый элемент будет отображаться.Если дважды щелкнуть любую другую пустую область в списке, добавляется новый элемент, но он не входит в режим редактирования.Что здесь происходит?

1 Ответ

0 голосов
/ 06 марта 2011

Нажатие мыши на другом элементе управления приводит к тому, что этот другой элемент управления запрашивает фокус, и поэтому перемещение фокуса вызывает событие TextBox.Leave.Предотвращение любого другого возможного контроля от запроса фокуса не очень жизнеспособный вариант.Но, к счастью, вам нужно только запретить ListView использовать MouseDown для смещения фокуса.Таким образом, вам нужно переопределить WndProc вашего ListView, и когда появляется сообщение окна MouseDown, и вы в данный момент показывает TextBox, вы едите сообщение.Другими словами, вы не позволяете базовому классу обрабатывать его.

...