我正在开发一个C#WinForm应用程序。
一旦表单“显示”并且表单的布局完成,我想触发一些处理。
我正在使用“_Shown”事件,但这似乎在表单布局完成之前触发。布局完成后,是否有可以使用的事件?
答案 0 :(得分:18)
将Application.DoEvents()
放在表单的Shown事件处理程序的开头。这将强制渲染所有控件。
答案 1 :(得分:4)
我没有看到显示后你可以用于此目的的事件。您是否可以使用计时器来延迟您在Shown事件中的处理?
答案 2 :(得分:3)
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)
}
有点hacky,但确实有效
答案 3 :(得分:2)
这适合我,而且更少" hacky"比其他建议:
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.
}
答案 4 :(得分:1)
据我所知,事件顺序类似于
Form.Load
Form.Layout
Form.VisibleChanged
Form.GotFocus
Form.Activated
Form.Shown
因此,如果在Form.Show
之后仍然发生某些事情,那是因为你编码它的方式。
您是否可以动态创建表单?
答案 5 :(得分:0)
尝试使用 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属性设置为当前表格,焦点事件按以下顺序发生:
答案 6 :(得分:0)
最佳解决方案是Shown()事件:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx
"只有在第一次显示表单时才会显示所显示的事件;随后最小化,最大化,恢复,隐藏,显示或失效和重新绘制将不会引发此事件。"