2012-10-24 163 views
2

我有兩種形式,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

回答

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

在你的主要形式的代碼,在其中創建子窗體的新實例,添加一個觸發的事件時的實例子表單被激活。在事件h安德勒爲它設置一個布爾變量爲true。現在,對於子窗體實例的停用事件,除了將bool變量設置爲false之外,請執行相同的操作。 現在在主窗體失去焦點的事件中,在隱藏它之前檢查該bool變量並確保它是假的「子窗體沒有焦點」,只有這樣你才能隱藏主窗體。 我可以提供代碼,如果我能看到你到目前爲止。有很多不同的方法可以做到這一點。 希望這可以幫助你!

+1

它似乎不工作。我認爲mainForm的Deactivate在subForm的Activated之前被觸發。 – goodbyeworld

+0

哦!這就說得通了。如何讓你的主要表格在檢查前等一會兒。你可以把每個表單放在它自己的線程上,並暫停主線程的幾個ms來讓子表單激活。不幸的是,我仍然在學習,線程超越了我。嘗試使用谷歌搜索「C#線程兩種形式分開」對不起,我不能再幫助你! – FrostyFire

0

如果我理解正確,這聽起來像只是一個正常的MDI應用程序。你可以讓你的主窗體爲MDI Parent,並將子窗體MDI父窗體設置爲主窗體?大多數您正在談論的激活內容應該自動照顧?或者最多隻是將最小化事件捕獲到子表單中,然後還將mdi父表單最小化爲

+0

我不希望它是一個MDI應用程序。 – goodbyeworld