Инициирование события после завершения макета Winform - PullRequest
9 голосов
/ 05 января 2010

Я работаю над приложением C # WinForm.

Я хочу запустить некоторую обработку после того, как форма «показана» и макет формы завершен.

Я использую событие "_Shown", но, похоже, оно срабатывает до завершения макета формы. Могу ли я использовать событие, которое срабатывает после завершения макета?

Ответы [ 7 ]

18 голосов
/ 10 июня 2011

Поставьте Application.DoEvents() в начале обработчика события Shown формы. Это заставит все элементы управления отображаться.

4 голосов
/ 05 января 2010

Я не вижу события после Показанного, которое вы можете использовать для этой цели. Не могли бы вы использовать таймер для задержки обработки в событии Shown?

3 голосов
/ 05 января 2010

Старый трюк в VB6, который раньше использовал событие Paint:

bool firstShown = false;

void form_Paint(Object sender, EventArgs e) {
  if ( !firstShown ) {
    YourMethodThatNeedsToRunOnShown();
    firstShown = true;
  }

  //the rest of your paint method (if any)

}

Немного хакерский, но работает

2 голосов
/ 27 июля 2015

Это работает для меня и гораздо менее "хакерски", чем другие предложения:

protected override void OnLayout(LayoutEventArgs levent)
{
    base.OnLayout(levent);

     if(someControl == null)
       return; // be careful of OnLayout being called multiple times

    // otherwise, do some stuff here, set control sizes, etc.
}
1 голос
/ 05 января 2010

Насколько я помню, порядок событий что-то вроде

Form.Load
Form.Layout 
Form.VisibleChanged
Form.GotFocus
Form.Activated
Form.Shown

Так что если что-то все еще происходит после Form.Show, это из-за того, как вы его закодировали.

Возможно, вы создаете форму динамически?

0 голосов
/ 05 марта 2015

Лучшим решением является событие Shown (): http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx

«Событие Shown вызывается только при первом отображении формы; последующее сворачивание, максимизация, восстановление, скрытие, отображение или аннулирование и перерисовка не вызовут это событие.»

0 голосов
/ 05 января 2010

Попробуйте использовать Form.GotFocus (унаследовано от контроля) .. как то так.

   private void Form1_Load(object sender, EventArgs e)
    {
        this.GotFocus += new EventHandler(Form1_gotFocus);
        this.Focus();
    }

    private void Form1_gotFocus(object sender, EventArgs e)
    {
      // You will need to Switch focus from form at the end of this function, 
      //to make sure it doesnt keep Firing.
    }

Согласно MSDN, происходит следующее:

При изменении фокуса с помощью клавиатуры (TAB, SHIFT + TAB и т. Д.), Путем вызова методов Select или SelectNextControl, или путем установки для свойства ContainerControl .. ::. ActiveControl текущего форма , события фокуса происходят в следующем порядке:

  1. Введите
  2. GotFocus
  3. Leave
  4. Пользователи
  5. Утвержденные
  6. LostFocus
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...