2012-03-23 20 views
1

私はフローティングコントロールとして動作するユーザーコントロールを持っています。基本的に私が必要とするのは、境界線のないように動作するコントロールを持つことです。Form実際はFormでしたが、MainFormウィンドウでFocusを保持する必要があったので、UserControlに変更する必要がありました。タブの順序を1つのユーザーコントロールに限定する

Form A(MainForm)と私のUserControlを想像してください。BはAの子コントロールです。フォームAにはボタンとテキストボックスがあり、コントロールBにはボタンとテキストボックスもあります。 currenly発生secuenceは以下の通り、現在(自然のタブ順序の行動を)何が起こる

のみAは、(Bが表示されていない)表示されている :

1. The user manually focuses A textbox 
2. Press tab key 
3. A button is focused 

Aが表示され、またBが表示されている場合:(天然タブ順序キーは、以下である):

1. The user manually focuses B textbox 
2. Press tab key 
3. B button is focused 
4. Press tab key 
5. A textbox is focused 
6. Press tab key 
7. A button is focused 

私は必要なもの(私はフォーカスを維持するために、私のユーザーコントロールを変更する必要があります):

私が本当に必要とする、B制御が内のタブ順序を維持するということですので、私は必要なものですBコントロールが表示されているときに:

1. The user manually focuses B texbox 
2. Press tab key 
3. B button is focused 
4. Press tab key 
5. B textbox is focused 
+0

あなたはこれを行うべきではない - それはユーザーのみ(例えば視覚障害者の人々) –

+0

私は**これを行うために必要**キーボード用のナビゲーション能力を破ります。私のユーザーコントロールは、フローティングコントロールとして動作します。現在の行動は奇妙です。 –

+0

あなたはモーダルダイアログにあなたのユーザコントロールを表示できますか?それはあなたが複製しようとしているもののようです。 –

答えて

0

最後に、私は括弧で次のコードを含む問題を解きますtコントロール:

private int WM_KEYDOWN = 0x100; 

    public override bool PreProcessMessage(ref Message msg) 
    { 
     Keys key = (Keys)msg.WParam.ToInt32(); 

     if (msg.Msg == WM_KEYDOWN && key == Keys.Tab) 
     { 
      if (itemSearchControl.Visible) 
      { 
       bool moveForward = !IsShiftKeyPressed(); 
       bool result = itemSearchControl.SelectNextControl(itemSearchControl.ActiveControl, true, true, true, true); 
       return true; 
      } 
     } 

     return base.PreProcessMessage(ref msg); 
    } 
0

あなたはコントロールズKeyDownイベントを上書きすることができますし、手動でフォーカスを受け取るコントロールの上でフォーカスを移動します。それはさておき

は、私はあなたがBのユーザーコントロールの可視性を切り替えますを押すいくつかのボタンを持っていると仮定してい

0

...それは、ナビゲーションを壊すかもしれないウィル・ヒューズに同意します。それが目に見えてフォーカスがあれば、フォーカスを維持します。それを非表示に切り替えるときだけ、フォーカスが失われます。

// store when we last clicked the toggle B user control visibility 
private Stopwatch _sinceLastMouseClick; 

public Form1() 
{ 
    InitializeComponent(); 
    // instantiate the stopwatch and start it ticking 
    _sinceLastMouseClick = new Stopwatch(); 
    _sinceLastMouseClick.Start(); 
} 

あなたの浮動Bコントロールのクリックハンドラの表示を切り替えボタン:そのような場合、あなたは、ユーザーコントロールを非表示にしない限り、ユーザーコントロールにあなたの焦点を維持するフォームでこのコードを試みることができます:あなたの親で

private void btnToggleBUserControlVisibility_Click(object sender, EventArgs e) 
{ 
    // reset the stopwatch because we just clicked it 
    _sinceLastMouseClick.Restart(); 
    myUserControl1.Visible = !myUserControl1.Visible; 
} 

フォーム、浮動ユーザーコントロールのLeaveイベントを処理:

private void myUserControl1_Leave(object sender, EventArgs e) 
{ 
    // see if the mouse is over the toggle button 
    Point ptMouse = System.Windows.Forms.Control.MousePosition; 
    Point ptClient = this.PointToClient(ptMouse); 
    // if the mouse is NOT hovering over the toggle button and has NOT just clicked it, 
    // then keep the focus in the user control. 
    // We use the stopwatch to make sure that not only are we hovering over the button 
    // but that we also clicked it, too 
    if (btnToggleBUserControlVisibility != this.GetChildAtPoint(ptClient) || 
     _sinceLastMouseClick.ElapsedMilliseconds > 100) 
    { 
     myUserControl1.Focus(); 
    } 
} 
関連する問題