Непослушный детский диалог, C # .Net Winforms - PullRequest
2 голосов
/ 02 августа 2011

Я использую WinForms для проекта C #, и моя основная форма имеет простую кнопку, которая использует ShowDialog (this) во второй форме, чтобы показать его.Как это:

if (myParameterForm.ShowDialog(this) == DialogResult.OK)
   {//stuff happens}

Согласно моим требованиям, когда дочерняя форма видима, вы не можете получить доступ к родительской форме.

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

При загрузке дочерняя форма использует «this.TopMost = true» на всякий случай, я добавил это, чтобы решить мою проблему.Я не использую никаких других функций визуализации в дочерней форме, поток, вызывающий форму, буквально ждет там, пока форма не будет закрыта.

Так как у пользователя нет доступа к клавиатуре или чему-либо, кроме сенсорного экрана, я раздраженотносительно того, как дочерней форме удается скрыться за родительской формой.На самом деле мне не удалось воспроизвести поведение, и я видел его только в результате ответа на запросы на обслуживание.

Я хочу избежать использования таймера для постоянной проверки, является ли форма TopMost, потому что она просто кажется неправильной,Должен ли я пересмотреть?Какое событие может произойти, что исключает мою дочернюю форму за кулисами?

Я пытался использовать поиск, но, насколько я могу судить, я делаю это правильно ... Предполагая, что есть какой-то зловещийСтороннее приложение, вызывающее случайные перебои, каков наилучший способ автоматически выявлять и исправлять эту ситуацию без периодической проверки?Я не уверен, что именно событие VisibleChanged - это то, что я ищу.

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Я могу воспроизвести описываемое вами поведение, свернув дочернее окно, когда оно отображается с помощью ShowDialog.Возможно ли, что что-то минимизирует дочернее окно?Вы можете попробовать отключить блок управления для дочернего окна, чтобы увидеть, помогает ли это.Возможно, я бы также установил для ShowInTaskbar значение false для дочернего окна (по соображениям удобства использования).

1 голос
/ 02 августа 2011

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

0 голосов
/ 02 августа 2011

По моему опыту, окна TopMost и модальные диалоги никогда не ведут себя очень хорошо ... так как вы можете заблокировать себя, если окно TopMost перекрывает элемент управления модального диалога.Применяете ли вы TopMost к главному окну где-нибудь в вашем коде?

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