将焦点移动以响应XAML键盘事件(Move focus in response to keyboar

2019-09-01 07:43发布

我有两个文本框一个WPF视图。 我想自动转发从第一个文本框将焦点移到第二当用户点击酷似标签并在键盘上的向下箭头。

好像我应该能够以声明的方式做到这一点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,这是一个视图的关注。 我刚落少许代码隐藏(该视图的关注,这是合理的),但它只是感觉就像我失去了一些东西。

Answer 1:

我希望有人能拿出的东西更优雅,这,但是这是我到目前为止所。 这是不是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);
}


文章来源: Move focus in response to keyboard events in XAML