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

时间:2015-09-25 07:58:21

标签: c# winforms

我已经为搜索做了一个用户控件。在搜索时,弹出窗口将打开。现在,我想从用户控件访问 Form_Resize Form_LocationChanged 事件。

3 个答案:

答案 0 :(得分:1)

在Control构造函数中,您必须订阅控件的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,直到它的形式。只是不是那么清楚你想要实现什么。

此外,请记住,如果更改,您可以取消订阅上一个父项的事件。但这是另一个也是一个非常棘手的问题。

修改
您不需要自己递归搜索表单,有FindForm()方法,@ jmcilhinney提到

答案 1 :(得分:0)

每个控件都有一个FindForm方法,它将返回包含控件的表单,即使层次结构中存在其他控件也是如此。一旦您获得对表单的引用,您就可以使用与运行时任何其他对象完全相同的方式处理其事件。

答案 2 :(得分:0)

如果您尝试从构造函数访问它,则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...
}