使用MVVM在WPF中设置控件的焦点

8

当我在视图上点击按钮时,我希望键盘焦点被设置到文本框。我不想使用任何代码后端,所以想知道是否有人编写了一个附加属性或类似的解决方案?

1个回答

5

试试这个:

public static class FocusBehavior
{
    public static readonly DependencyProperty ClickKeyboardFocusTargetProperty =
        DependencyProperty.RegisterAttached("ClickKeyboardFocusTarget", typeof(IInputElement), typeof(FocusBehavior),
        new PropertyMetadata(OnClickKeyboardFocusTargetChanged));

    public static IInputElement GetClickKeyboardFocusTarget(DependencyObject obj)
    {
        return (IInputElement)obj.GetValue(ClickKeyboardFocusTargetProperty);
    }

    public static void SetClickKeyboardFocusTarget(DependencyObject obj, IInputElement value)
    {
        obj.SetValue(ClickKeyboardFocusTargetProperty, value);
    }

    private static void OnClickKeyboardFocusTargetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var button = sender as ButtonBase;
        if (button == null)
            return;

        if (e.OldValue == null && e.NewValue != null)
            button.Click += OnButtonClick;
        else if (e.OldValue != null && e.NewValue == null)
            button.Click -= OnButtonClick;
    }

    private static void OnButtonClick(object sender, RoutedEventArgs e)
    {
        var target = GetKeyboardClickFocusTarget((ButtonBase)sender);

        Keyboard.Focus(target);
    }
}

然后使用它,
<TextBox x:Name="TargetTextBox"/>
<Button b:FocusBehavior.ClickKeyboardFocusTarget="{Binding ElementName=TargetTextBox}"/>

谢谢,这给了我一个良好的开端! - devdigital
这个例子运行得很好。然而,在以下的方法中有一个小改动。你需要调用GetClickKeyboardFocusTarget方法而不是GetKeyboardClickFocusTarget:private static void OnButtonClick(object sender, RoutedEventArgs e) { var target = GetClickKeyboardFocusTarget((ButtonBase)sender); Keyboard.Focus(target); } - user840898

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接