2009-04-09 31 views
10

ich ein seltsames Verhalten von Listview-Steuerelement in WPF haben.wpf listview verloren den Fokus

Wir entwickeln Anwendung in C#.

Ich erstellte ListView mit einigen Elementen und legte SelectedIndex auf einen Index in der Mitte seiner Liste. Dann habe ich mit der Maus an einer beliebigen Stelle auf dem ListView geklickt und dann mit Up/Dows Tastaturtasten navigiert, alles funktioniert einwandfrei. Aber wenn bewege ich mich auf eine andere Steuerung konzentrieren und dann zu setzen versucht, Listview Steuerelement programmgesteuert Fokus zurück, dann das Problem, das ich bin immer.

Das Listview den Fokus erhält, aber wenn Iâ € ™ m mit dem wird Tastatur, aktuelle Auswahl versuchen, gelöscht werden, um zu navigieren und das erste Element wird ausgewählt und Navigation wird von dem ersten Element in der Liste starten.

Ich setze den Fokus auf ListView-Steuerelement durch Aufruf seiner .Focus() -Methode.

Es sieht aus wie sogar ListView Steuerelement im Fokus, aber keine Elemente tatsächlich in Fokus, auch wenn SelectedIndex einige gültige Werte hat.

Bitte, hilf mir! Wie kann ich den Fokus auf die ListView-Steuerung programmgesteuert auf festlegen, um ein solches Verhalten zu verhindern?

finde ich heraus, dass meine Listenansicht ausgewählter Index aus dem fokussierten Punkt unterscheidet. wer ???

in selectedindex_changed Ereignis habe ich den ausgewählten Index zu den Fix Punkt (5), aber wenn ich den Pfeiltasten den Punkt drücken geändert wurde. Das bedeutet, dass der ausgewählte Index auf 5 festgelegt ist, aber der aktuelle Punkt (mit einem Punkt umrandet) an die Position der Pfeiltaste verschoben wurde. sowieso ist meine selecteditem auf 5, aber meine scrollviews bewegt sich in Position, dass aktuelle Element ist.

Dieser Code ist in listView1_SelectionChanged: listView1.SelectionMode = SelectionMode.Single; listView1.SelectedIndex = 5;

meine Listenansicht eine modifizierte Ansicht:

<l:PlainView x:Key="tileView" 
      ItemTemplate="{StaticResource centralTile}" 
      ItemHeight="120" ItemWidth="130" /> 

i mehr wissen über die problom nicht.

Grüße

+1

Hey hast du eine Lösung für dieses gefunden? Ich habe genau das gleiche Problem und finde es nicht heraus! –

+0

Ruft nicht .Focus() generell eine schlechte Übung in irgendeiner GUI/Frameworks/Sprachen? –

+0

Also, wie sonst setzen Sie den Fokus dann? – Sam

Antwort

6

Listview leidet wahrscheinlich aus dem gleichen Problem, das List-Box der Fall ist, dass es den Fokus unabhängig von seiner Produkte haben kann.

Wenn ich eine List-Box konzentrieren will, muss ich so etwas wie dies tun:

listBox1.Focus(); 
if (listBox1.Items.Count > 0) 
{ 
    var index = listBox1.SelectedIndex; 
    if (index < 0) index = 0; 

    var item = listBox1.ItemsContainerGenerator 
        .ContainerFromIndex(index) as ListBoxItem; 
    item.Focus(); 
} 

So dies die ListBox konzentriert, aber dann, wenn die List-Box enthält alle Elemente konzentriert sie sich entweder das ausgewählte Element oder die erster Artikel, wenn einer ausgewählt ist.

Ich habe nie ListView in WPF verwendet, aber vermutlich können Sie eine ähnliche Methode mit ListView anstelle von ListBox und ListViewItem anstelle von ListBoxItem hacken.

+1

Ich empfehle Focusable = False auf der ListBox/ListView, so dass es nicht unabhängig Fokus erhalten kann, und dann einfach verwenden: if (UiListBox.SelectedItem! = Null) {(UiListBox.SelectedItem als UIElement) .Focus();} – rmoore

+4

Ja, ich habe mit der Einstellung Focusable = False auf dem Host-Steuerelement gespielt, aber das gibt Ihnen einige seltsame Fokusprobleme, wenn die Liste leer ist. Manchmal möchten Sie sich immer noch auf eine leere Liste konzentrieren, so dass Sie listenspezifische Tastenkombinationen usw. abfangen können. Die Bindung von Focusable an Items.Count mit einem Trigger würde besser funktionieren. –

+0

ListView ist ein Kind von ListBox, also hat Ihr Beispiel gut für mich funktioniert. Das Einzige, was ich geändert habe, ist, listBox1.SelectedIndex auch auf 0 zu setzen, wenn (index <0), also Fokus und ausgewähltes Element übereinstimmen. – Sam