我正在开发 C# WinForm 应用程序。
我想在表单“显示”并且表单布局完成后触发一些处理。
我正在使用“_Shown”事件,但这似乎是在表单布局完成之前触发的。是否有我可以使用的事件在布局完成后触发?
将
Application.DoEvents()
放在表单的 Shown 事件处理程序的开头。这将强制渲染所有控件。
在显示您可以用于此目的后,我没有看到任何事件。您不能使用计时器来延迟 Shown 事件中的处理吗?
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,但确实有效
这对我有用,并且比其他建议要少得多“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.
}
据我所知,事件顺序是这样的
Form.Load
Form.Layout
Form.VisibleChanged
Form.GotFocus
Form.Activated
Form.Shown
因此,如果在
Form.Show
之后仍然发生某些事情,那是因为您的编码方式所致。
您是否可以动态创建表单?
最好的解决方案是 Shown() 事件:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.shown.aspx
“仅在第一次显示表单时引发 Shown 事件;随后的最小化、最大化、恢复、隐藏、显示或无效和重画不会引发此事件。”
尝试使用 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 属性设置为当前窗体 来更改焦点时,焦点事件按以下顺序发生:
试试这个:
private void Form1_Load(object sender, EventArgs e)
{
Application.Idle += Form1_Loaded;
}
private void Form1_Loaded(object sender, EventArgs e)
{
Application.Idle -= Form1_Loaded;
// do the stuf
}