Уведомление, когда моя форма полностью загружена в C # (.Net Compact Framework)? - PullRequest
2 голосов
/ 22 ноября 2010

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

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

У кого-нибудь есть идеи, как мне это сделать?

Ответы [ 5 ]

8 голосов
/ 22 ноября 2010

Что означает «полностью загруженный»?Вы имеете в виду, что событие «Загрузка» было успешно продолжено?

Вы можете сделать это:

public class MyForm : Form {
    protected override void OnLoad( EventArgs e ) {
        // the base method raises the load method
        base.OnLoad( e );

        // now are all events hooked to "Load" method proceeded => the form is loaded
        this.OnLoadComplete( e );
    }

    // your "special" method to handle "load is complete" event
    protected virtual void OnLoadComplete ( e ) { ... }
}

Но если вы имеете в виду «полностью загружен», то «форма загружена и показана»нужно переопределить метод "OnPaint" тоже.

public class MyForm : Form {
    private bool isLoaded;
    protected override void OnLoad( EventArgs e ) {
        // the base method raises the load method
        base.OnLoad( e );

        // notify the "Load" method is complete
        this.isLoaded = true;
    }

    protected override void OnPaint( PaintEventArgs e ) {
        // the base method process the painting
        base.OnPaint( e );

        // this method can be theoretically called before the "Load" event is proceeded
        // , therefore is required to check if "isLoaded == true"
        if ( this.isLoaded ) {
            // now are all events hooked to "Load" method proceeded => the form is loaded
            this.OnLoadComplete( e );
        }
    }

    // your "special" method to handle "load is complete" event
    protected virtual void OnLoadComplete ( e ) { ... }
}
4 голосов
/ 22 ноября 2010

Я думаю, что событие OnLoad не совсем то, что вам нужно, так как оно происходит до отображения формы.Вы можете использовать Application.Idle с OnLoad для создания события OnLoaded:

protected override void OnLoad(EventArgs args)
{
    Application.Idle += new EventHandler(OnLoaded);
}

public void OnLoaded(object sender, EventArgs args)
{
   Application.Idle -= new EventHandler(OnLoaded);
   // rest of your code 
}
0 голосов
/ 23 марта 2016

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

Я создал и установил значение bool для формы:

private bool formShown = false;

, а затем добавил следующую строку в Form_Load ()

this.Paint += (s, args) => { formShown = true; };

с первой строкой моего обработчика событий VisibleChanged () как:

if(!formShown) { return; }

Сжато и функционально.

0 голосов
/ 22 ноября 2010

Вы можете использовать событие Load формы. В конструкторе вашей формы напишите следующую строку

this.Load += new System.EventHandler(this.Form1_Load);

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

void Form1_Load(object sender, EventArgs e)
{
    // do some stuff here.
}
0 голосов
/ 22 ноября 2010

вы должны иметь возможность использовать событие OnLoad.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onload.aspx

...