2015-11-10 8 views
13

いくつかのフォーカス可能な要素(Buttons、Images、...)がXAMLで静的に生成され、動的にコード生成されるものがいくつかあるページがあります。このページで、タブキーを押すと、要素が1つずつフォーカスされます。つまり、現在の要素の周りに点線の線が表示されます。さて、私は現在選択されている要素を選択したいと思います。それはあまりにも青い線を表示することを意味します。フォーカスされた動きのように、選択されますプログラムでフォーカス要素を選択するにはどうすればよいですか?

どうすればC#コードビハインドで行うことができますか?

enter image description here

+0

背後

コードは、あなたが本当にtrueに 'IsFocused'を設定する、または単に要素がその焦点に見えるようにしたいですか? – Domysee

+2

たとえば、グリッドのように、フォーカスできるアイテム、選択できないアイテムがあります。とにかく、何を管理するには、おそらく['FocusManager'](https://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager(v = vs.110).aspx)を使う必要があります。取得が選択されます。また、フォーカスは一度に制御できるため、選択した項目は一度に1つしか選択できません。 – Kcvin

+0

私はあなたの質問を正しく理解していないかもしれないと思っています。私が間違っていなければ、ボタンや画像にはWPFで「選択」されているという概念はありません。ちょうどあなたの要素の周りに点線の代わりに(どのような種類があるかもしれない)焦点を合わせたときに、代わりに青い線が欲しいと言っていますか? – Rowbear

答えて

4

編集:

を私はあなただけのタブストップの点線を変更で必要なものだと思います。その破線は選択された状態を示す。したがって、すでに選択されています。この '選択された要素を選択する'ステートメントは意味をなさない.TabStopを参照している場合は、実際には既に選択されているからです。 Tabキーを押して点線で囲んだ部分をテストすることができます。ボタンでありEnterキーを押すとClickイベントが発生します(後ろにハンドラがある場合)。

必要なものはthisです。

コードビハインドでそれを行う場合は、これをXAMLのリソースに追加します。

<Style x:Key="MyFocusVisual"> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Rectangle Margin="-2" StrokeThickness="1" Stroke="Blue" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
</Style> 
.... 
myButton.FocusVisualStyle = (Style)FindResource("MyFocusVisual"); 

あなたはXAMLへのアクセス権を持っていない場合、私はこのことから考えて、あなたはコードビハインドでスタイルを追加し、ボタンにスタイルを追加する方法を見つけ出すことができます。コードビハインドを目指しているので、XAMLの権利にアクセスできないことは不可能です。これはXAMLを介してコードを追加するよりも現実的です。

+0

タブは特殊なケースです。私はボタンのような他の要素を求める画像e –

9

あなたが持っているフォーカス可能な要素の種類によって、おそらく最良の方法が異なると言えますか?あなたはlistboxitemさんのためにこれをしたい場合は、あなただけでこれを行うことができますので、のようにXAML:

<UserControl.Resources> 
    <Style TargetType="ListBoxItem"> 
     <Style.Triggers> 
      <Trigger Property="IsFocused" Value="True"> 
       <Setter Property="Selector.IsSelected" Value="True"></Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 
<ListBox> 
    <ListBoxItem> 
     Blah 
    </ListBoxItem> 
</ListBox> 

似たスタイルのトリガーは、他のフォーカス可能と選択可能な要素にも適用することができます。

+0

そのページにはいくつかの要素があります。 Selector.IsSelectedをすべてxamlファイルに設定したら、どちらが選択されますか?コードの背後でこれをどうやってやり遂げることができるのだろうか? –

+0

@ WaterfrVillaページに複数の要素がある場合、現在フォーカスのある要素のいずれかが選択されます。これはあなたが望む行動ではありませんか?なぜあなたは具体的にはコードの中でそれをやりたいのですか?私はこれがxamlで行われた場合、よりきれいに行われることの1つであるように感じます。 – Rowbear

+0

ダウンボードの説明には注意が必要ですか?元の質問には、コードの背後でそれをやりたかったと述べられていませんでした。私は元のプロンプトに基づいてそれに答えました。 – Rowbear

1

あなたが参照している要素のタイプがすべて選択できるわけではありません。

C#でこれを行い、いくつかの要素が動的に追加され、キーボードが要素をタブで移動します。私はあなたの焦点を絞ったアイテムを追跡し、現在フォーカスされている要素に基づいて何をしようとしているかを実行するメソッドを実装することをお勧めします。 Using the keyboard focus method.

protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e) 
{ 
    var focusedElement = e.Source as IInputElement; 
    // Do something here 
} 
3

私はすべての要素がボタンまたはボタンのテンプレートのいずれかであることを確実にするでしょう。このようにして "IsTabStop"を使用するか、要素にフォーカスを当てることができます。 MrsEdのソリューションを使用 あなたはアイテムが正しく縁取りされるように得ることができます。

<Button x:Class="Visualisation.UserControlButtonImage" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      IsTabStop="True"> 
    <Button.Template> 
     <ControlTemplate> 
      <Grid> 
       <Image/> 
      </Grid> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 
2

私はXMLでやりました。私はすべての子コントロールにフォーカスイベントを処理するためのルート要素(ユーザーコントロールまたはウィンドウ)にPreviewGotKeyboardFocus使用

   PreviewGotKeyboardFocus="FrmBase_OnPreviewGotKeyboardFocus" 

私の窓にPreviewGotKeyboardFocusを追加しました。

private void FrmBase_OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    try 
    { 
     dynamic item = e.NewFocus; 
     item.IsSelected = true; 
    } 
    catch (Exception ex) 
    { 

    } 
} 
関連する問題