2016-10-11 3 views
0

私はいくつかのボタンを持つウィンドウと動的に作成された複数のタブ項目を持つタブコントロールを持つWPFを使用してデスクトップアプリケーションを作成しています。各タブ項目には多数のコントロールがあります。Tabキーの最後のタブを押すとTabキーの次のタブに切り替わります。

私の現在のタブ項目の最後のコントロールをタブを押した後、次のタブ項目に移動したいと思います。今は、ウィンドウ全体と同じタブ項目のすべてのコントロールを循環します。タブインデックスを設定して、KeyboardNavigation.TabNavigation = "Once"とLocal、Cycle、Continueなどを設定しようとしましたが、それは役に立ちませんでした。

「逮捕の日」のタブを押すと、「Texas」タブの最初のコントロールに移動しますが、同じタブの「名前」コントロールに戻ります。

Move to next tab on tab key press

答えて

1

Control+Tabを押すと次のタブが表示され、そのタブの最初のコントロールがフォーカスを持っています。後方にナビゲートするには、Control+Shift+Tabを使用します。

1

タブにはNameプロパティが設定されている必要があります(x:NameXAML)。タブの「最後の」項目には、Nameプロパティが設定されている必要があります。今TabControlオブジェクトのKeyDown(またはKeyUp)イベントを設定

Debug.WriteLine("key pressed: " + e.Key); 
if (e.Key == Key.Tab) 
{ 
    if (btnButton.IsFocused) tab2.Focus(); 
} 

Debug.WriteLine(...)は鍵がすべてが動作されると、その行をコメントまたは削除、捕獲されていることを確認することです。

タブを順番にフォーカスするには、余分なコード行が必要です。

private void tabControl_KeyDown(object sender, KeyEventArgs e) 
{ 
    Debug.WriteLine("key pressed: " + e.Key); 
    if (e.Key == Key.Tab) 
    { 
     var tabs = tabControl.Items.Cast<TabItem>().ToArray(); 

     var tab=tabs.Select((t, i)=>new {i, t}).SingleOrDefault(t => t.t.IsSelected); // one has to be selected. result is null of no tabs are present (then why have a tab control?) 

     if (tab == null) return; 
     switch (tab.i) 
     { 
      case 0: 
       if (btnButton.IsFocused) 
        tab2.Focus(); 
       break; 
      case 1: 
       tab3.Focus(); 
       break; 
      case 2: 
       tab4.Focus(); 
       break; 
      case 3: 
       tab1.Focus(); // jump to first? 
       // OR do something else 
       break; 
      default: 
       break; 
     } 
    } 
} 

は、フォーム上のあなたの「最後」の項目でbtnButtonを交換してください:ここでは完全なKeyDownイベントです。

+0

私はこのアプローチについて考えましたが、これはうまくいくでしょうが、私は手動で最後のコントロールを特定し、一般的なシナリオでは難しくないかもしれない各タブ項目の次のタブを見つける必要があります。私の場合、すべてのタブは動的に生成され、顧客によって定義されたいくつかのパラメータに基づいて異なります。したがって、タブの順序はすべての顧客にとって同じではない可能性があります。また、いくつかのシナリオではタブが追加されない場合もあります。たとえば、顧客が指紋システムを必要としない場合、「指紋」タブは生成されません。 (続き) – Jay

+0

同様に、各タブ内のコントロールは、さまざまなパラメータとアプリケーションモードに基づいて存在することも、存在しないこともあります。これにより、タブ項目の最後のコントロールを見つけることが難しくなります。何よりも、もし私がそれを手動で定義する良い方法ではないでしょう。だから、私は疑問に思っていたwpfがこれのためにinbuiltを提供するものがありますか?ありがとう! – Jay

+0

'TabControl'自体ではなく、特定の最後のコントロールの' KeyDown'(または 'KeyUp')イベントに対してこれを行うことができます。文字通り 'if(e.Key == Key.Tab)tabX.Focus();'のような1行の文字列になります。ここで 'tabX'はアクティブ化したいタブです。 – nurchi

関連する問題