2016-08-04 5 views
1

私はPanelを含むMainViewフォームを持っています。私は別のクラス(発表者)を使用して、異なるイベントに応じてそのパネルに表示されるフォームを管理します。これらのサブフォームの1つが表示されたら、キーを押し下げてそのサブフォームを応答させたいと思っています。ただし、keydownイベントはメインフォームのみのサブフォームでヒットしません。インテリアフォームをキーダウンイベントに対応させるには?

私はMAINVIEWから行くのないキーイベントに対応するために、サブフォームを取得する方法を知りたい - >プレゼンター - >サブビュー。

+0

あなただけのサブフォーム上のイベントリスナーを追加することができませんか? – Pseudonym

+0

'KeyPreview'プロパティが必要です。 – Jonesopolis

+0

@ Jonesopolis KeyPreviewプロパティをtrueに設定しようとしましたが、Key_Downイベントの開始時にブレークポイントにヒットしません。 –

答えて

1

あなたのプレゼンタークラスは、それがパネルに入れているフォームを認識しているので、それはまた、そのフォームからか、デフォルトのフォーカスを持っていることを意図している形でどのような制御に関連するデータから取得する必要があります。おそらく、あなたのプレゼンタークラスは、そのパネル上の特定のフォームを示して方法を持っているので、あなたのような何かを実行します。

Presenter.ShowForm(MainViewPanel, Form1); 

あなたは、その後のような何かをする必要がありますが:私は考え出し

Form1.Controls.OrderBy(x => x.TabIndex).First().Focus(); 
+2

フォームにフォーカスを設定しないでください。フォーム内のコントロールにフォーカスを設定します。 – AgapwIesu

0

何が焦点を当てていますか?フォーカスのある子フォームにコントロールがない場合は、キーボードイベントは表示されません。


また、子フォームでKeyPreviewをtrueに設定してみてください。

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110).aspx

+0

MainViewのpanel.Controlsコレクションにサブフォームをプログラムで追加しています。 subForm.Focus();という行を追加しました。それでも動作しませんでした。また、KeyPreviewがtrueに設定されていても、動作していないようです。ブレークポイントはトリガされません。 –

+0

WinFormsのプログラミングをして以来、しばらくしてきましたが、フォーム自体に焦点を当てることはできません。私はそれがコントロールでなければならないと思う。 –

0

よし私の問題は何だったの?それはいくつかの記事の組み合わせではありましたが、私はすべてを一箇所に置いて一箇所に置かなければなりませんでした。

私はこのようになります方法があります。

private void DisplayView(Form view) 
{ 
    if (view == null || view == _mainView) return; 

    view.TopLevel = false; 
    _mainView.GameArea.Controls.Clear(); 
    _mainView.GameArea.Controls.Add(view); 
    view.Dock = DockStyle.Fill; 
    view.BringToFront(); 
    view.Show(); 
    _mainView.GameArea.Controls[0].Focus(); 
} 

これは、それを固定回線た:

_mainView.GameArea.Controls[0].Focus(); 

よりもむしろ「ビュー」変数を経由してフォーカスを設定し、私がいたがこのように視点に焦点を合わせることができます。

私も同様にパネルのコレクションから他のビューを削除する必要がありました:

_mainView.GameArea.Controls.Clear(); 
関連する問題