Переместить фокус в ответ на события клавиатуры в XAML - PullRequest
3 голосов
/ 26 октября 2009

У меня есть представление WPF с двумя текстовыми полями. Я хотел бы автоматически перемещать фокус вперед от первого текстового поля ко второму, когда пользователь нажимает стрелку вниз на клавиатуре точно так же, как Tab.

Кажется, что я должен быть в состоянии сделать это на 100% декларативно, но по некоторым причинам команды, которые я думал, будут делать это, похоже, ничего не делают. Вот моя первая попытка, которая не работает:

<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>

У кого-нибудь есть опыт с этим? Похоже, я должен иметь возможность использовать либо InputBindings, либо EventTrigger для этого.

Я использую MVVM, и это проблема View. Я мог бы просто добавить немного кода назад (это проблема с точки зрения просмотра, это разумно), но мне просто кажется, что я что-то упустил.

1 Ответ

5 голосов
/ 26 октября 2009

Я надеюсь, что кто-то придумает что-нибудь более изящное, чем это, но это то, что я имею до сих пор Это не 100% XAML, но, по крайней мере, является общим.

В этом примере показано окно с двумя кнопками и двумя текстовыми полями. Стрелка вниз переключает фокус между ними.

Надеюсь, это поможет.

<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>

Обработчик событий (вообще без обработки ошибок):

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);
}
...