Frage

Ich habe eine WPF -Ansicht mit zwei Textboxen. Ich möchte den Fokus automatisch vom ersten Textfeld zum zweiten vorwärts bewegen, wenn der Benutzer den Abwärtspfeil auf der Tastatur genau wie die Registerkarte trifft.

Es scheint, als ob ich in der Lage sein sollte, dies zu 100% deklarativ zu tun, aber aus irgendeinem Grund scheinen die Befehle, die ich dachte, nichts zu tun. Hier ist mein erster Versuch, der nicht funktioniert:

<StackPanel>
    <TextBox Text="Test">
        <TextBox.InputBindings>
            <!-- I realize ComponentCommands.MoveFocusDown doesn't work...
                 This is just an example of what I've tried and the type
                 of answer I'm looking for -->
            <KeyBinding Key="Down" Command="ComponentCommands.MoveFocusDown" />
        </TextBox.InputBindings>
    </TextBox>
    <TextBox></TextBox>
</StackPanel>

Hat jemand Erfahrung damit? Scheint, als ob ich dazu in der Lage sein sollte, entweder Inputbindings oder einen EventTrigger zu verwenden.

Ich benutze MVVM und dies ist ein Anblick. Ich könnte einfach ein kleines Codebehind fallen (als Ansicht, das ist vernünftig), aber es fühlt sich nur so an, als würde mir etwas fehlen.

War es hilfreich?

Lösung

Ich hoffe, jemand hat etwas Elegierenderes, das dies ist, aber das habe ich bisher. Es ist nicht 100% xaml, aber zumindest generisch.

Dieses Beispiel zeigt ein Fenster mit zwei Schaltflächen und zwei Textfeldern. Der Down -Pfeil zykliert den Fokus zwischen ihnen.

Ich hoffe das hilft.

<Window x:Class="WPF_Playground.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    >
    <Window.CommandBindings>
        <CommandBinding Command="ComponentCommands.MoveFocusDown" Executed="CommandBinding_Executed"/>
    </Window.CommandBindings>
    <StackPanel KeyboardNavigation.DirectionalNavigation="Cycle">
        <Button>Tester</Button>
        <Button>Tester2</Button>
        <TextBox Text="Test">
            <TextBox.InputBindings>
                <KeyBinding Command="ComponentCommands.MoveFocusDown" Gesture="DOWN" />
            </TextBox.InputBindings>
        </TextBox>
        <TextBox Text="Test2">
            <TextBox.InputBindings>
                <KeyBinding Command="ComponentCommands.MoveFocusDown" Gesture="DOWN" />
            </TextBox.InputBindings>
        </TextBox>
    </StackPanel>
</Window>

Der Ereignishandler (überhaupt keine Fehlerbehandlung):

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    UIElement senderElement = sender as UIElement;
    UIElement focusedElement = FocusManager.GetFocusedElement(senderElement) as UIElement;
    bool result = focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    Debug.WriteLine(result);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top