Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF: Focus für OnPreviewKeyDown/KeyBindings im UserControl
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

Themenstarter:

WPF: Focus für OnPreviewKeyDown/KeyBindings im UserControl

beantworten | zitieren | melden

Moin,

ich möchte in einem UserControl OnPreviewKeyDown überschreiben bzw. einfache KeyBindings nutzen. Leider funktioniert dies nicht in allen Fällen.

Wie bei Microsoft (Focus Overview) zu lesen ist, gibt es einen logischen und einen Tastaturfokus.

Das erklärt, warum es funktioniert, wenn "auswählbare" Elemente (wie TextBox, Button, CheckBox, ComboBox) auf dem UC selektiert werden, und warum es nicht funktioniert, wenn "nicht auswählbare" Elemente (wie GroupBox, Label) auf dem UC "selektiert" werden oder wenn an eine leere Stelle im UC geklickt wird.

Es gibt u.a. den Workaround, Focusable im UC auf true zu setzen und im Loaded bzw. MouseUp-Event über Keyboard.Focus das UC auszuwählen. Das finde ich jedoch unschön.

Hat zufällig jemand schon mal das gleiche Problem gehabt und eine elegantere Lösung?
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3430
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,

das geht wenn ich es richtig verstehe in die Richtung [gelöst] UserControl KeyDown aktivieren?

Kannst Dir ja mal den dort verlinkten Thread auf Stackoverflow anschauen. Es läuft allerdings auch dort darauf hinaus, das Focusable auf true gesetzt wird, also letztlich Dein bereits gefundener Workaround.
Eine andere Lösung wüsste ich jetzt auch nicht.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Hallo,

wofür brauchst du das denn ? ... du kannst das ganze auch wesentlich eleganter lösen, je nach anwendungsfall hast du verschiedene möglichkeiten.

grundsätzlich sind der logische fokus und tastaturfokus was ganz anderes, das eine ist wirklich für benutzereingaben gedacht, am logischen fokus hängt wesentlich mehr, als einfache eingaben...

du kannst mit behaviours arbeiten, bietet sich in manchen fällen an...wenn du einfach nur auf tastendruck innerhalb eines controls arbeiten willst, kannst du auch commandbindings verwenden...(bubbling/tunneling), je nach dem wie komplex dein ui-aufbau ist.

events zu abonnieren ist immer etwas "risky" ... events sind, wenn man nicht damit aufpasst, sehr schwer zu debuggen, da man mit denen ganz leicht einen zirkulären aufruf erzeugen kann, für die man wiederrum einen hack braucht um sie zu umgehen.
Wenn's zum weinen nicht reicht, lach drüber!
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

Themenstarter:

beantworten | zitieren | melden

Danke für eure Antworten.

Ich habe es aktuell so gelöst, dass ich beim Loaded des Controls das KeyBinding zum ParentWindow hinzufüge - und beim Unloaded wieder entferne. Funktioniert ganz gut.

@Parso:
Ich benötige es, um auf eine Tastenkombination zu reagieren.
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Dann reicht ein einfaches CommandBinding voll aus..deine Tastaturkombi wird, wenn es vom fokusierten Control nicht ausgewertet wird, an das Parent geschickt...bis es entweder beim Fenster ankommt oder auf einen "auswerter" trifft...

Geht also auch ohne "häggerei" im Code-Behind

vg
Wenn's zum weinen nicht reicht, lach drüber!
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

Themenstarter:

beantworten | zitieren | melden

Mir ist ehrlich gesagt nicht ganz klar, worauf du hinaus willst. Wo wird denn jetzt das CommandBinding definiert? Hast du zufällig ein Beispiel?
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Du kannst über die InputBindings Tastenkombinationen mit einem Command verbinden, das Command kann zb in einer statischen Klasse oder deinem ViewModel hinterlegt sein:

    <Grid>
        <Grid.InputBindings>
            <KeyBinding Command="{x:Static MyCommandCollection.MyCommand}" Key="A" Modifiers="Control" ></KeyBinding>
        </Grid.InputBindings>
    </Grid>

CommandBinding war daher nicht ganz korrekt...ist immer ne Sache was man meint und was man sagt, bzw schreibt ;)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Parso am .
Wenn's zum weinen nicht reicht, lach drüber!
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1053

Themenstarter:

beantworten | zitieren | melden

Genau das funktioniert eben nicht. Siehe Ausgangsbeitrag.
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

Hm habs mal Probiert...scheinbar "spruckt" das Bubbling drauf wenns an nem Panel hängt, sobald man das auf ein überliegendes Control legt, klappts wieder. Könntest rein theoretisch auf nen Container gehen...also ContentPresenter oder so, hab ich noch nicht probiert...müsste aber gehen...
Wenn's zum weinen nicht reicht, lach drüber!
private Nachricht | Beiträge des Benutzers