2011-08-07 24 views
1

ここに私のUIのスクリーンショットがあります。 enter image description hereItemsControlの項目にフォーカスを強制するにはどうすればよいですか?

すべてのバインドされた質問オブジェクトのリストに:

class Question 
{ 
    public Answer[] Answers { get; set; } 
    public string Text { get; set; } 
} 

class Answer 
{ 
    public bool IsSelected { get; set; } 
    public string Text { get; set; } 
} 

それは私が友人のために書いている例えばだ、と私はまだ相対MVVMの初心者です。 (回答にIsSelectedのようなUIコンセプトを持つのは正しくないと分かっていますが、それは友人を混乱させることなく機能します)。私はPageUpキーとPageDownキーは、質問を移動する設定の入力バインディングを持っている

<DataTemplate x:Key="question" DataType="{x:Type local:Question}"> 
    <Grid> 
     <Grid.RowDefinitions> ... </Grid.RowDefinitions> 

     <TextBlock Text="{Binding Text}" /> 

     <ItemsControl Grid.Row="1" 
         ItemsSource="{Binding Answers}" > 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <RadioButton Content="{Binding Text}" 
           GroupName="Answer" 
           IsChecked="{Binding IsSelected}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</DataTemplate> 

:右側には、これとのContentPresenterはDataTemplateを切り取らです。質問が変更されたら、右側のラジオボタン(好きなものがあれば選択されているもの)のどれかをフォーカスしたいと思います。目標は、上下の矢印キーを使用して回答を選択し、PageUp/PageDownを使用して質問間を移動することです。

ラジオボタンにタブすることができ、矢印キーが機能しますが、スペースを押して選択すると、回答のフォーカスがリストボックスに戻ります。正直なところ、リストボックスには全く焦点が当てられずに済むはずです。 Focusableにfalseを設定すると、ラジオボタンの中にフォーカスが置かれているように見えますが、IsTabStopをFalseに設定しても、Tabキーはリストボックス内でフォーカスを得ることができます。

悪い古いWinFormsでは、最初のラジオボタンを見つけたリストボックスのSelectedIndexChangedハンドラがあり、GotFocusハンドラと一緒に焦点を合わせ、ホットポテトのようにフォーカスを外しました。ラジオボタンはテンプレートの一部なので、私はそれを行うための明確でエレガントな道筋は見当たりません。私が望む行動をどうやって得ることができますか? "あなたのUIを再設計する"というのは、仕事が終わっても受け入れられる答えですが、コードビハインドを最小限に抑えた解決策を望んでいます。あまりにも多くのWinFormsを思い出させます。

答えて

0

あなたがFocusManagerを使用する必要があるようだ - 私はあなたがUIを設計したくありませんでしたが、あなたはリストボックス、ラジオボタンリストのように見せることができた知っhttp://cloudstore.blogspot.com/2008/06/setting-initial-focus-in-wpf.htmlhttp://msdn.microsoft.com/en-gb/system.windows.input.focusmanager.aspx

+0

私はドン」それがどのように役立つか見てください。その技術を使用するには、要素へのアクセスが必要です。私はそれがDataTemplateによって生成されているためアクセスできません。私は何が欠けている。 – OwenP

+0

あなたはGrid.Rowに焦点を当てようとする可能性があります – Yahia

+0

これを行う別の方法はhttp://stackoverflow.com/questions/570194/focus-datatemplate-in-wpf/582843#582843を参照してください – Yahia

0

を参照してください。 WPF ListBoxがあなたの望むことをするのかどうかは分かりませんが、フォーカスの取り方が異なり、SelectedIndexプロパティを設定できます。

0

あなたができる何か:

<RadioButton ... 
      Loaded="RBAnswer_Loaded"/> 
private void RBAnswer_Loaded(object sender, RoutedEventArgs e) 
{ 
    var rb = (RadioButton)sender; 
    var answer = (Answer)rb.DataContext; 
    if (answer.IsSelected) rb.Focus(); 
} 

(あなたの後ろにコードを取り除くためにコマンドでブレンド対話のInvokeCommandActionのようなものを使用することをカプセル化する可​​能性が...)