【问题标题】:How does a Windows Forms control know when its form was (de)activated?Windows 窗体控件如何知道它的窗体何时(停用?
【发布时间】:2010-03-03 13:16:55
【问题描述】:

我有一个 C# .NET 中的 Windows 窗体应用程序。它包含一个用户绘制的控件,该控件还处理键盘焦点。如果控件的一部分具有焦点,则会在其周围绘制焦点高亮边框。当包含控件的窗体被停用时,焦点边框显然必须从控件中消失。但是控件甚至没有收到有关它的通知。它只在另一个控件获得焦点时接收“离开”事件,而不是另一个窗口。控件怎么会知道呢?

【问题讨论】:

    标签: c# forms controls focus


    【解决方案1】:

    当Form+Control加载完毕后,Control可以订阅Form的Activate和DeActivated事件。

    如果它是一个用户控件,您可以使用 Control.Load 事件来执行此操作。对于 CustomControl,我必须查找它。

    无论如何,请务必在您的控件中实现 Dispose 以取消订阅事件。

    试了一下:

    private void UserControl1_FormActivate(object sender, EventArgs e)
    {
        label1.Text = "Acitve";
    }
    
    private void UserControl1_FormDeActivate(object sender, EventArgs e)
    {
        label1.Text = "InAcitve";
    }
    
    private void UserControl1_Load(object sender, EventArgs e)
    {
        this.ParentForm.Activated += UserControl1_FormActivate;
        this.ParentForm.Deactivate += UserControl1_FormDeActivate;
    }
    

    【讨论】:

    • 谢谢。我希望有一种更直观的方法。我在 OnLoad 方法中添加了两个事件处理程序。现在我在控制的另一部分得到了一个奇怪的 OutOfMemory 异常;并且 ParentForm 在 Dispose 方法中为空,所以我不能再取消注册事件了!有什么想法吗?
    • 好的,将此标记为答案。它有效,我设法解决了另一个错误。我假设取消订阅事件是不必要的,因为在 Dispose 方法中 ParentForm 无论如何都是空的。如果他们不同意,请任何人回答我。
    • @Lonely,除非您在运行时经常添加/删除此控件,否则它并不重要。
    • 一个老问题,但也许它可以帮助别人:如果自定义控件不继承UserControl(因此既不存在Load事件也不存在ParentForm属性),那么你可以在控件的GotFocus 事件中将事件处理程序添加到this.FindForm,假设在没有获得焦点之前值不会改变。至少在我的情况下,只要控件失去足够的焦点,我就想检测/验证更改。 (不幸的是,LostFocusLeaveValidating 如果表单已停用,请不要触发。)
    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2014-05-19
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多