2011-09-04 36 views
0

C#WinForms:我有一個MDI表單,我已經爲其菜單定義了一些快捷鍵,例如「ALT + C」打開Actions工具欄按鈕。問題是,如果我在父窗體中打開這個子窗體,但仍然在父窗體內點擊我的鼠標並按下「ACLT + C」,它仍然響應它並打開子窗體的「Actions」菜單。我怎樣才能防止這一點?爲什麼父窗體正在響應子窗體的快捷鍵?

回答

1

添加您的形式

bool actionWindow = false 

上的標誌,然後當窗口打開時設置actionWindow爲true。在你的監聽器中檢查actionWindow。然後當actionWindow關閉時,將bool設置爲false。

嘗試:在子窗體中放置e.Handled = true;在重點新聞事件。

+0

它就像一個「黑客」,它不會通過代碼審查。 – Bohn

+0

我沒有對MDI表單做過任何事情,但對我來說,你描述的行爲是正確的。你必須使用MDI作爲父表單嗎? –

+0

我們已經升級了這個應用程序從VB 6.0和VB 6.0中,當我點擊「ALT + C」它不會打開子窗體的操作菜單。所以在代碼審查他會說不,它不同於VB,爲什麼你沒有白盒子,等等...... – Bohn

1

可能有更好的解決方案,但快速的方法是測試表單是否有焦點。因此,在您的孩子的事件處理程序,添加以下頂部:

if (this.MdiParent.ActiveControl.Name != this.Name) 
{ 
    return; 
} 

顯然,這沒有阻止的情況下燒製而成,只是防止後續代碼運行。

編輯:如果菜單項沒有事件處理程序,我能想到的這樣做的唯一的另一種方式是爲子窗體的EnterLeave事件創建處理程序:

private void ChildForm_Leave(object sender, EventArgs e) 
{ 
    menuItem.Enabled = false; 
} 

private void ChildForm_Enter(object sender, EventArgs e) 
{ 
    menuItem.Enabled = true; 
} 
+0

這會工作嗎?父事件在子事件之前觸發。 –

+0

說得太快......它確實奏效,對不起! –

+0

保羅在我的孩子形式的什麼方法,事件處理程序等我應該嘗試你的代碼? – Bohn

相關問題