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

问题描述:

我有两种形式,mainForm和subForm。当mainForm失去焦点时,我想让subForm消失,然后在mainForm重新获得焦点时重新出现。我在mainForm上使用Activated和Deactivate事件来跟踪mainForm是否具有焦点。当激活被激活时,我做subForm.Show()和相反的停用。我遇到的问题是,当subForm获得焦点mainForm消失,因为我不知道如何以编程方式说“让subForm在mainForm的Deactivate事件触发时消失,除非它是因为subForm获得了焦点。当mainForm因为用户点击另一个应用程序或使用ALT + TAB切换而失去焦点时,这两个窗口都会消失。我不想离开子窗体。是否有任何方法检查Deactive是否是火焰因为属于该应用程序的另一种形式获得焦点,而不是一些其他的应用程序?C#表单激活和取消激活事件

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. 
    } 
} 
+0

或许,这将有很大的帮助,如果你发布你正在使用,因为它是很难没有看到你在做什么,这样的技术问题做出响应的代码。此外,您可能会得到无关紧要的答案,因为其他人可能会认为您在做X时已经完成了y。 – PyNEwbie

+0

我发布了一些演示代码。 – goodbyeworld

+1

@ user1779914如果您发现下面的答案有用,您应该将其标记出来。如果您觉得其中一个问题是您的问题的“正确”答案,则应选中该复选框。这有助于提供投资回报,为您提供答案,并帮助其他人寻找类似问题的解决方案。从长远来看,这有助于您的声誉,因为如果您的问题有很多答案,对问题的观点数量可以提高您的声誉。 – PyNEwbie

这个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(); 
     } 
    } 
} 

在你的主要形式的代码,在其中创建子窗体的新实例,添加一个触发的事件时的实例子表单被激活。在事件h安德勒为它设置一个布尔变量为true。现在,对于子窗体实例的停用事件,除了将bool变量设置为false之外,请执行相同的操作。 现在在主窗体失去焦点的事件中,在隐藏它之前检查该bool变量并确保它是假的“子窗体没有焦点”,只有这样你才能隐藏主窗体。 我可以提供代码,如果我能看到你到目前为止。有很多不同的方法可以做到这一点。 希望这可以帮助你!

+1

它似乎不工作。我认为mainForm的Deactivate在subForm的Activated之前被触发。 – goodbyeworld

+0

哦!这就说得通了。如何让你的主要表格在检查前等一会儿。你可以把每个表单放在它自己的线程上,并暂停主线程的几个ms来让子表单激活。不幸的是,我仍然在学习,线程超越了我。尝试使用谷歌搜索“C#线程两种形式分开”对不起,我不能再帮助你! – FrostyFire

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

+0

我不希望它是一个MDI应用程序。 – goodbyeworld