繁体   English   中英

c#如何在用户控件中捕获Windows窗体事件?

[英]c# How do I catch Windows Form Events in user control?

我已经做了搜索的用户控件。 在搜索时会弹出一个窗口。 现在,我想从用户控件访问Form_ResizeForm_LocationChanged事件。

在控件构造函数中,您必须预订控件的ParentChanged事件,才能知道何时可以获取控件的当前父级。

public YourControl()
{
    InitializeComponent();
    ParentChanged += OnParentchanged;
}

private void OnParentchanged(object sender, EventArgs e)
{
    // maybe get Form istead of just parent control
    Parent.Resize += OnParentResize;
    Parent.LocationChanged += OnParentLocationChanged;
}

然后,您必须订阅所需的表单事件。 事实是,您的控件的Parent可能是另一个控件,因此您可能要递归搜索所有Parents直到它形成为止。 并不是很清楚您想要实现什么。

另外,请记住,如果前一个父级发生更改,您将取消订阅该事件。 但这是另一个非常棘手的问题。

编辑:
您不需要自己递归搜索表单,@ jmcilhinney提到了一个FindForm()方法。

每个控件都有一个FindForm方法,该方法将返回包含该控件的表单,即使层次结构之间也存在其他控件。 一旦引用了表单,就可以使用与其他对象在运行时完全相同的方式来处理其事件。

如果尝试从构造函数访问它,则Parent对象可能为null。 我要做的是在UserControl的Load事件中添加引用。

private void CustomControl_Load(object sender, EventArgs e)
{        
    ParentChanged += OnParentChanged;
}

private void OnParentChanged(object sender, EventArgs e)
{
    Parent.Resize += OnParentResize;
    Parent.LocationChanged += OnParentLocationChanged;
    // More events or
    // Do Something...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM