【发布时间】:2017-07-14 09:35:36
【问题描述】:
我创建了自定义控件。我想在 Form.Shown 事件之后在我的自定义控件中执行。我尝试过在 Form.Shown 事件之前触发的 Control.GotFocus 事件。我想在 Form.Shown 事件之后对我的控件进行更改。
有可能吗?如果是的意思,请建议我怎么做?
谢谢,
【问题讨论】:
我创建了自定义控件。我想在 Form.Shown 事件之后在我的自定义控件中执行。我尝试过在 Form.Shown 事件之前触发的 Control.GotFocus 事件。我想在 Form.Shown 事件之后对我的控件进行更改。
有可能吗?如果是的意思,请建议我怎么做?
谢谢,
【问题讨论】:
您可以报名参加活动:
public class MyControl : UserControl
{
// you need a reference to the hosting Form
public MyControl(Form frmHost)
{
frmHost.Shown += FormHost_Shown;
}
private void FormHost_Shown(object sender, EventArgs e)
{
// Do your work
}
}
当您创建控件实例时,只需传递对托管表单的引用:
this.Controls.Add(new MyControl(this));
如果您需要无参数构造函数,您可以将托管 Form 设为控件的属性,并在 Shown 事件发生之前设置该属性:
public class MyControl : UserControl
{
private Form frmHost;
public Form FrmHost
{
get
{
return frmHost;
}
set
{
frmHost = value;
frmHost.Shown += FormHost_Shown;
}
}
private void FormHost_Shown(object sender, EventArgs e)
{
// Do your work
}
}
public class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// User control was created elsewhere (perhaps in the designer)
myUserControl.FrmHost = this;
}
}
【讨论】:
不,第一次激活 Windows 窗体时,documented 事件的顺序如下:
Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.ActivatedForm.Shown如您所见,Shown 是最后触发的事件。您需要在自定义基础Form 中实现自己的事件:
public event EventHandler AfterShwon;
protected override void OnShown(EventArgs e)
{
base.OnShow(e);
OnAfterShown(e);
}
protected virtual void OnAfterShown(e)
{
AfterShwon?.Invoke(this, e);
}
【讨论】: