Щелчок по меню приводит к тому, что форма теряет фокус, а выпадающее меню исчезает

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

Я создал две формы Windows Forms: Form1 и Form2. К обоим добавлено MenuStrip. Оба установлены на StartPosition = CenterScreen.

Form1 имеет простое меню, подобное этому: Form2 > Open. Нажатие «Открыть» запустит Form2.

Form2 имеет простое меню, подобное этому: Try to open > anotherTestMenuItem

  1. Запустите программу. Form1 открывается.
  2. Откройте Form2 из Form1 (т.е. нажмите Form2 > Open).
  3. Form2 появляется.
  4. На Form2 попробуйте открыть MenuStrip (нажмите Try to open). Form1 снова появится поверх Form2, хотя Form2 все еще находится в фокусе (это можно увидеть, если немного сдвинуть Form2 перед попыткой открыть меню).

Если я установлю владельцем Form2 значение Form1, Form2 останется видимым при выполнении шага 4, но меню не отобразится в первый раз. Все последующие клики кажутся нормальными.

Я заметил это, когда пытался открыть контекстное меню (в форме, открытой другой формой), и оно сразу исчезало, но только в первый раз. Каждый раз после этого он открывался нормально.

У кого-нибудь есть идеи о том, что происходит?


person VineAndBranches    schedule 18.02.2014    source источник


Ответы (3)


Да, это известная ошибка в RTM-версии .NET 4.5. Об этом упоминается в этой статье базы знаний:

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

Например, вы можете столкнуться со следующим:
– При открытии контекстного меню в дочернем окне фокус принимает форма главного окна.
- Вы не можете использовать мнемонику для доступа к пункту меню.

Как вы можете понять из статьи базы знаний, эта ошибка была исправлена ​​довольно давно. Исправление ошибки было включено в отладочный выпуск, впервые выпущенный 8 января 2013 года. Обязательно разрешите Центру обновления Windows развернуть это обновление на вашем компьютере. Или загрузите его отсюда.

person Hans Passant    schedule 18.02.2014
comment
Вы, сэр, удивительны. Похоже, моим Центром обновления Windows управлял мой системный администратор, поэтому я так и не получил обновление. Я вручную загрузил/установил .NET 4.5.1, и проблема была решена. Спасибо за ваш опыт! - person VineAndBranches; 19.02.2014

Убедитесь, что у вас есть:

«AutoValidate» установлен на «EnablePreventFocusChange».

person James    schedule 18.02.2014
comment
Да, у меня AutoValidate установлено на EnablePreventFocusChange. - person VineAndBranches; 18.02.2014
comment
Я пытался воссоздать эту проблему пару раз, и я еще не видел, чтобы это произошло. В основном я создал 3 формы и начал с Form1 и смог добраться до Form3, не видя этого. Каждая форма имела MenuStrip, который указывал на следующую. Вы используете Visual Studio для разработки и запуска этого? - person James; 18.02.2014
comment
Здорово. Я боялся этого. Прежде чем опубликовать свой вопрос, я начал с нуля с другого проекта, просто чтобы убедиться, что у меня есть эта проблема с самого начала. Тем не менее, другие до сих пор, кажется, не видят эффекта. Я использую для этого Visual Studio Professional 2012. Я настраиваю все через GUI Builder, а не программно. - person VineAndBranches; 18.02.2014

Убедитесь, что вы не вызываете метод Hide для меню или контекстного меню во время обработчика щелчка элемента. У меня была привычка делать это во время разработки, чтобы убрать меню с экрана, пока я выполнял отладку кода. Однако, когда я запускал дополнительную форму из такого меню, первый щелчок правой кнопкой мыши в новой форме приводил к тому, что фокус возвращался к основной форме, иногда даже если я щелкнул левой кнопкой мыши или набрал что-то в новой форме. Я не помню, нашел ли я это решение где-то в Интернете или обнаружил его сам. Это может быть не та ошибка, о которой говорилось выше, но такое поведение все еще происходит в .NET 4.7.

person William Parke    schedule 01.12.2018