C#表单激活和取消激活事件

时间:2012-10-24 02:28:09

标签: c# winforms events

我有两种形式,mainForm和subForm。当mainForm失去焦点时,我希望subForm消失,然后在mainForm重新获得焦点时重新出现。我在mainForm上使用Activated和Deactivate事件来跟踪mainForm是否有焦点。当激活Activated时,我执行subForm.Show(),反之亦然。我遇到的问题是,当subForm获得焦点时,mainForm会消失,因为我不知道如何以编程方式说出#34;当mainForm的Deactivate事件触发时,使subForm消失,除非它因为subForm获得了关注。我正在做的事情的重点是当mainForm失去焦点时,两个窗口都会消失,因为用户点击了另一个应用程序或使用ALT + TAB切换。我不想让subForm落后。有没有办法检查Deactive是否因为另一个属于该应用程序的表单获得了重点而不是其他一些应用程序?

class MainForm : Form
{
    SubForm subForm = new SubForm();

    private void mainForm_Activated(object sender, EventArgs e)
    {
        this.subForm.Show();
    }

    private void mainForm_Deactivate(object sender, EventArgs e)
    {
        this.subForm.Hide()

        // I need some logic to make sure that it is only hidden
        // when the mainForm loses focus because the user clicked
        // some other application in the taskbar and not when the
        // subForm itself gains the focus.
    }
}

3 个答案:

答案 0 :(得分:2)

works on my machine

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    private Form2 _form2;
    private void Form1_Load(object sender, EventArgs e) {
        _form2 = new Form2();
        _form2.Show();
        HandleFocusEvents();
    }

    private void HandleFocusEvents() {
        this.LostFocus += Form_LostFocus;
        _form2.LostFocus += Form_LostFocus;
        this.GotFocus += Form_GotFocus;
    }

    private void Form_LostFocus(object sender, EventArgs e) {
        if (!_form2.ContainsFocus && !this.ContainsFocus) {
            _form2.Hide();
        }
    }

    private void Form_GotFocus(object sender, EventArgs e) {
        if (!_form2.Visible) {
            _form2.Show();
        }
    }
}

答案 1 :(得分:1)

在主窗体代码中,在创建子窗体的新实例的位置,添加在激活子窗体窗体的实例时触发的事件。在它的事件处理程序中,将bool变量设置为true。现在,对子表单实例的deactivate事件执行相同操作,但将bool变量设置为false。 现在,如果主窗体失去焦点,在隐藏它之前检查bool变量并确保它为假“子窗体没有焦点”,然后才会隐藏主窗体。 如果我能看到你到目前为止所提供的内容,我可以提供代码。你可以用很多不同的方法来做到这一点。 希望这能帮到你!

答案 2 :(得分:0)

如果我理解正确,这听起来就像一个普通的MDI应用程序。您可以将主窗体设为MDI Parent并将子窗体MDI parent设置为主窗体吗?你正在谈论的大多数这些激活的东西应该自动照顾?或者最多只是在子表单中捕获最小化事件,然后最小化mdi父表单