2009-04-30 6 views
8

WPFアプリケーションのすべてのUI要素のタブストップをプログラム的にナビゲートする方法を教えてもらえますか?最初のタブストップで対応する要素をスニッフィングし、次のタブストップを訪れ、対応する要素をスニッフィングして、最後のタブストップに達するまでします。WPF UI要素のタブがプログラムによってどのようにナビゲートするのですか?

おかげで、 - あなたがマイク

答えて

27

フォーカスについてのすべてを説明し、このMSDNの記事に示されているようMoveFocus指定を使用している:Focus Overviewを。

ここでは、次の焦点を絞った要素に到達するためのサンプルコードを示します(この記事から得た、わずかに変更されています)。

// MoveFocus takes a TraversalRequest as its argument. 
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next); 

// Gets the element with keyboard focus. 
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 

// Change keyboard focus. 
if (elementWithFocus != null) 
{ 
    elementWithFocus.MoveFocus(request); 
} 
+0

genial、ありがとうございます! – lamarmora

1

これは、MoveFocus呼び出しで実行できます。現在フォーカスされているアイテムはFocusManagerから取得できます。次のコードは、ウィンドウ内のすべてのオブジェクトを反復し、それらをリストに追加します。これは、フォーカスを切り替えることによってウィンドウを物理的に変更することに注意してください。ウィンドウがアクティブでない場合、ほとんどの場合、コードは機能しません。

// Select the first element in the window 
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 

TraversalRequest next = new TraversalRequest(FocusNavigationDirection.Next); 
List<IInputElement> elements = new List<IInputElement>(); 

// Get the current element. 
UIElement currentElement = FocusManager.GetFocusedElement(this) as UIElement; 
while (currentElement != null) 
{ 
    elements.Add(currentElement); 

    // Get the next element. 
    currentElement.MoveFocus(next); 
    currentElement = FocusManager.GetFocusedElement(this) as UIElement; 

    // If we looped (If that is possible), exit. 
    if (elements[0] == currentElement) 
     break; 
} 
+0

上記のコードはWPFウィンドウでは機能しませんでした。リストは空になります。上の最初のGetFocusedElement()呼び出しはnullを返します。私はこのコードがドキュメントと正確に一致することに同意しますが、残念ながらそれは私のためには機能しませんでした。私は理由を理解するために掘り下げています。 –

+1

コードはどこで呼び出されますか?ウィンドウはアクティブでなければならないので、コンストラクターは間違いなく存在することに注意してください。 OnLoadが機能するかもしれません、私はあなたがウィンドウをアクティブにするたびに呼び出されるActivatedを使用しました。 –

関連する問題