2012-03-29 19 views
1

ゲーム用のマップエディタを作成します。 Windows Forms UI(オブジェクトのプロパティを編集するpropertyGridなど)を持つプログラムですが、マップが描画されるパネルもあります。私が欲しいものフォームと矢印キーのC#フォーカス

:フォーカスがマップをパネル上にある場合

、私はイマイチに集中するとオブジェクト(数字キー)などを追加し、周り(矢印キー)のマップを移動するためにキーボードを使用したいのですがこのパネルは、私は、Windowsフォームで通常通りに動作するようにボタンが欲しい - コントロール間のタブに許可するなど

私のフォームは、次のようになります。

それは、メインメニューのmenuStripを(持っているToolStripControlを持っています)とstatusStrip(ステータスバー用)を使用します。フォーム(またはツールストリップコントロール)の中央で、SplitControlが2つのパネルを持つドックされます(ドック=塗りつぶし)。パネル1にはPanelMapがあり、地図を表示するPanel、Panel 2にはpropertygrid、tabcontrols、buttonsなどのその他すべてのものがあります。

フォームのKeyPreviewをtrueに設定し、フォームのkeydownイベントハンドラでキーボードイベントを処理しました。

ここで、PanelMapにフォーカスを割り当てると、次に矢印キーを押したときにKeyDownイベントが発生しません。 1つではありません! 「KeyPreview」を持っているので、すべてのイベントを処理するはずのフォームでさえも、そのイベントは発生しません。矢印を押すと、PanelMapはSplitControlに向かってフォーカスを失います。

PanelMapはフォーカスを持っていないと思われます。SplitControlにフォーカスを当てることができます(フォーカスがある間に矢印キーを押すと、それ以上の処理をすることができます)。しかし、SplitControlの内部にあるテキストボックスのようなものにフォーカスがあると、SplitControlはフォーカスを取得できません。 .Focus()は何もしません - それを持っていたコントロールにフォーカスが残ります!

なぜそれは異常に機能するのですか?パネルにフォーカスと矢印キーが押されているときに、フォームのKeyDownが起動しないのはなぜですか? CanFocus = trueでも、なぜ私は.Focus()を呼び出すと、SplitControlにフォーカスが当てられないのですか?

最終的に、私は何をしたいのですか?それを行う方法はありますか?

+0

オーバーライドは、フォームのProcessCmdKey()キーストロークを飲み込むします。それ以上処理されるキーストロークを行っていない場合は、単にfalseを返します。 –

答えて

1

私はあなたのイベントがそれらのナビゲーションに行く前に、キーストロークを取ってウィジェットに入っていると思います。私はこの問題があったが、これをしなかった:

private void RemoveCursorNavigation(Control.ControlCollection controls) 
    { 
     foreach(Control ctrl in controls) 
     { 
      ctrl.PreviewKeyDown += new PreviewKeyDownEventHandler(MainWin_PreviewKeyDown); 
      RemoveCursorNavigation(ctrl.Controls); 
     } 
    } 

私はこのように、メインフォームのLoadハンドラでこの関数を呼び出す:あなたのPreviewKeyDownハンドラで

RemoveCursorNavigation(this.Controls); 

、あなたがこれを実行する必要があります。

public void MainWin_PreviewKeyDown(Object sender, PreviewKeyDownEventArgs e) 
    { 
     switch(e.KeyCode) 
     { 
      case Keys.Up: 
      case Keys.Down: 
      case Keys.Left: 
      case Keys.Right: 
       e.IsInputKey = true; 
       break; 
      default: 
       break; 
     } 
    } 

e.IsInputKey = true;は、このイベントを使用したことを外部に伝え、他の場所には移動しないように指示します。

これでウィジェットに移動する前にキーストロークが表示され、カーソルキーからそれらのナビゲーションを取得することはできません。

+0

問題は、彼らはまだウィジェットに入る!私はプレビューキーを試してみました - プレビューキーでイベントをスムーズまたは処理する方法がありません。つまり、オブジェクトによって処理されることを意味します...したがって、フォームの周りにジャンプするフォーカスがあります – Istrebitel

+0

'e.IsInputKey =それは私が使うものです。 – Almo

+0

まあ、ありがとう。私の方法は完璧に私のために働くが(誰かがそれを落としたとしても)、私はこのようにすることを検討する。 – Istrebitel

0

私はこのような答えを見つけました:

私はパネルの下に隠されているテキストボックスを作った(ただし、有効になっており、目に見えます)。このテキストボックスには、PanelMapにフォーカスを「ロック」したいときにフォーカスが与えられます。 eでもonkeydownを持っています。suppress = trueにすると、テキストボックスにはキーストロークが適用されません。

原油回避策が、不思議...典型的なMの$ビジネスを働く...

関連する問題