2012-05-04 16 views
0

wpfアプリケーションのキーボードナビゲーションに問題があります。 簡体字私は、画面の幅の約四分の一を占めるメニュー項目のリストを持つ水平スタックパネルを持っています。wpfキーボードのナビゲーション動作

私は画面全体の幅をとるコンテンツコントロールを直接使用しています。

コンテンツコントロールは、強調表示されたメニュー項目に基づいて、読み込まれたユーザーコントロールを変更します。すべてのユーザーコントロールは

<Grid> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Grid Grid.Column="0" /> 
     <Grid Grid.Column="1" /> 
    </Grid> 
</Grid> 

の形で設定されている問題は、私はのStackPanelからダウンキーを押したときに、それが直接その下にインナーグリッド列にフォーカスを与えることを試みることです。最初の列にはフォーカス可能な項目が含まれていますが、2番目の列にはフォーカスできません。 これは、最初の列のすぐ上にあるスタックパネルの最初の2つのメニュー項目でうまく動作しますが、最終的に2番目の列の直上にあるメニュー項目に到達します。この時点では、ナビゲートできません。

上記のxamlに示すように外側グリッドを追加しましたが、これは役に立たなかったです。グリッド(または内側のグリッド)で使用可能な最初のフォーカス可能な要素にフォーカスが移動しないと、どのようにして1列にフォーカスを置くことができますか?

私はviewmodelでこれを行うことができますが、同様の問題を抱えている多数のページがありますので、すべてのキーボードナビゲーションを完全に書き換えて制御するよりも簡単な解決策が望まれます。

ご協力いただければ幸いです。

更新:最初のグリッドでfocuasableをtrueに設定した場合、ナビゲーションは機能して1桁目になりますが、明らかにグリッドにフォーカスが置かれている間は何もしないようにするために、私は同様の動作が必要ですが、ナビゲーションがグリッドを1列目にまっすぐジャンプさせる必要があります。

答えて

0

解決策を投稿します。私はそれがちょっとハックのように見えるが、何かがうまく来るまで.....まだそれに満足していない。 上記のようにキーボードのナビゲーションはグリッドで動作するようだが、グリッドが必要ないフォーカスを持っている。 私がやったことは、グリッドを拡張するカスタムコントロールを作成することです。 キーボードフォーカスの取得をオーバーライドし、フォーカスが最後にあった要素を調べ、グリッド外にあることを確認します(I.E)グリッドにナビゲートします。 これが当てはまる場合は、フォーカスがどのような方向から来たのかを見ていきます。私はPredictFocusが上と下のキープレスから来る可能性が高いと言います。それがこの解決策がちょっとハッキリだと思う理由です。 方向が見つかったら、その方向にもう一度フォーカスを移動するだけです。これが機能するには、グリッド上にフォーカス可能でなければなりません。

protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e) 
    { 
     UIElement previousFocus = (UIElement)e.OldFocus; 
     if (previousFocus != null) 
     { 
      if (!previousFocus.IsDescendantOf(this)) 
      { 
       if (previousFocus.PredictFocus(FocusNavigationDirection.Up).Equals(this)) 
       { 
        this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up)); 
       } 
       else if (previousFocus.PredictFocus(FocusNavigationDirection.Down).Equals(this)) 
       { 
        this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down)); 
       } 
       else if (previousFocus.PredictFocus(FocusNavigationDirection.Left).Equals(this)) 
       { 
        this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left)); 
       } 
       else if (previousFocus.PredictFocus(FocusNavigationDirection.Right).Equals(this)) 
       { 
        this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right)); 
       } 
      } 
     } 
     base.OnGotKeyboardFocus(e); 
    }   
関連する問題