2

我有两种形式,mainForm 和 subForm。当 mainForm 失去焦点时,我希望 subForm 消失,然后在 mainForm 重新获得焦点时重新出现。我使用 mainForm 上的 Activated 和 Deactivate 事件来跟踪 mainForm 是否有焦点。当 Activated 被触发时,我执行 subForm.Show() 和相反的 Deactivate。我遇到的问题是,当 subForm 获得焦点时 mainForm 消失,因为我不知道如何以编程方式说“当 mainForm 的 Deactivate 事件触发时使 subForm 消失,除非是因为 subForm 获得了焦点。我在做什么就是在mainForm因为用户点击另一个应用或者使用ALT+TAB切换而失去焦点时让两个窗口都消失。我不想把subForm丢在后面。

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.
    }
}
4

3 回答 3

2

适用于我的机器

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();
        }
    }
}
于 2012-10-24T07:32:18.067 回答
1

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

于 2012-10-24T03:02:41.367 回答
0

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

于 2012-10-24T03:03:36.713 回答