Как указать, какой элемент управления должен быть сфокусирован при открытии формы? - PullRequest
8 голосов
/ 16 июня 2009

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

Вопрос в том, как изменить это во время выполнения без необходимости динамически переставлять порядок табуляции. Например, некоторые формы могут захотеть изменить изначально ориентированный элемент управления на основе логики программы, чтобы сделать фокус наиболее подходящим. Если вы просто сфокусируете какой-то другой элемент управления внутри вашего обработчика OnLoad, логика по умолчанию будет выполнена в любом случае и перефокусирует элемент управления по умолчанию.

Если вы пишете на C / C ++ и используете необработанную оконную процедуру или MFC , вы можете вернуть 0 (FALSE) из вашего обработчика WM_INITDIALOG, и логика фокусировки по умолчанию будет пропущена , Однако я не могу найти способ сделать это в Windows Forms . Лучшее, что я придумал, - это использование BeginInvoke для установки фокуса после окончания OnLoad, например:

protected override void OnLoad( System.EventArgs e )
{
    base.OnLoad( e );
    // ... code ...
    BeginInvoke( new MethodInvoker( () => this.someControl.Focus() ) );
}

Должен быть какой-то правильный способ сделать это - что это?

Ответы [ 3 ]

13 голосов
/ 17 июня 2009

Покопавшись в Reflector, я нашел «правильный» способ сделать это: использовать ContainerControl.ActiveControl . Это можно сделать из OnLoad (или в другом месте; см. Документы об ограничениях) и напрямую сообщает платформе, какой элемент управления вы хотите сфокусировать.

Пример использования:

protected override void OnLoad( System.EventArgs e )
{
    base.OnLoad( e );
    // ... code ...
    this.ActiveControl = this.someControl;
}

Это кажется самым чистым и простым решением на данный момент.

1 голос
/ 16 июня 2009
   public void ControlSetFocus( Control^ control )
   {

      // Set focus to the control, if it can receive focus.
      if ( control->CanFocus )
      {
         control->Focus();
      }
   }    
0 голосов
/ 16 июня 2009

Вместо использования события OnLoad вы не можете использовать Form.Activated или Form.Shown события, чтобы увидеть, называются ли они пост-рендерингом фокуса управления?

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