Отображение формы через Form.Show не получает фокус?

У меня две формы, Form1 и UserControl, в котором размещается Form2. Внутри этого UserControl на Form1 я вызываю Form2.Show();. Я также пробовал Form2.Show(this);. В любом случае, внимание не уделяется форме. Мне нужно щелкнуть один раз в новой форме, чтобы придать ей фокус, а затем я могу щелкнуть элементы в этой форме.

Я понял, что управление возвращается к моему основному управлению/форме, и поэтому фокус теряется. Итак, я жду, пока Form2 не закроется через:

      while (form2.Visible == true)
      {
          System.Threading.Thread.Sleep(100);
          Application.DoEvents();
      }    

Кажется, это работает. Однако после того, как я закрою форму, теперь верно обратное. Form1 не получает фокус (даже если я вызываю this.Focus()), пока я не щелкну один раз в главном окне формы.

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


person esac    schedule 17.11.2010    source источник
comment
Пользовательский элемент управления, на котором размещена форма? Он просто создает его и вызывает Show() или он фактически действует как родитель для формы со свойством формы TopLevel, установленным в false? Показать код управления пользователя.   -  person Hans Passant    schedule 17.11.2010
comment
Он просто действует как родитель. Это ComboBox, в котором я «раскрываю» свой собственный ListView, а не стандартный диалог. Этот ListView размещен в форме (я не смог найти способ просто отобразить ListView напрямую). Я рассмотрю возможность добавления UserControl.   -  person esac    schedule 17.11.2010


Ответы (4)


Вероятно, вам следует использовать .ShowDialog(), это также может быть расширено, чтобы дать ваш ответ о том, правильно ли пользователь выполнил операцию Form2 или прервал ее раньше.

Это делает форму заблокированной в фокусе впереди и остановит выполнение вашего кода в первой форме до тех пор, пока эта форма не будет закрыта.

person Aren    schedule 17.11.2010
comment
Проблема в том, что я хочу, чтобы пользователь мог действовать и в основной форме, и когда он это сделает, он закроет эту форму. Что-то вроде всплывающего окна. - person esac; 17.11.2010

используйте this.Activate(); вместо this.Focus();

person Javed Akram    schedule 17.11.2010

Не уверен, что полностью понимаю, но из вашего UC попробуйте открыть Form2 следующим образом:

form2.Show(Parent);

Это должно указать родительскую форму UC как владельца form2.

person Jay Riggs    schedule 17.11.2010

Это произошло из-за того, что я переопределял WndProc для отображения формы. Когда я получал сообщение CBN_DROPDOWN, я отображал форму. Я исправил это, вместо этого вызвав метод, который показывает форму, и это исправлено.

case CBN_DROPDOWN:
    Invoke(new MethodInvoker(Show_DropDown));
    return;
person esac    schedule 25.11.2010