2011-09-04 12 views
0

C#WinForms:私はMDIフォームを持っていて、アクションツールバーのボタンを開くために、例えば "ALT + C"などのメニュー用のショートカットキーをいくつか定義しました。問題は、親フォーム内でこの子フォームを開いても、親フォーム内のどこかでマウスをクリックし、「ACLT + C」を押しても子フォームの「アクション」メニューを開いていることです。どうすればこれを防ぐことができますか?窓がtrueに設定されactionWindow開いたとき親フォームが子フォームのショートカットキーに応答しているのはなぜですか?

答えて

1

は、フォーム上

bool actionWindow = false 

をフラグを追加します。リスナーでactionWindowを確認します。その後、actionWindowが閉じると、boolをfalseに戻します。

try:子フォームでput e.Handled = true;キープレスイベントで

+0

それ"ハック"のようなもので、コードレビューに合格しません。 – Bohn

+0

私はMDIフォームで何もしていませんが、記述している動作が正しいことは私には意味があります。 MDIを親フォームとして使用する必要がありますか? –

+0

"ALT + C"をクリックするとVB 6.0とVB 6.0からこのアプリケーションがアップグレードされました。子フォームのアクションメニューは表示されません。コードレビューで、彼はいいえ、それは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

Paul私の子フォームのどのメソッド、イベントハンドラなどであなたのコードを試してみるべきですか? – Bohn

関連する問題