【问题标题】:Set focus to textbox in UWP from ViewModel从 ViewModel 将焦点设置到 UWP 中的文本框
【发布时间】:2017-02-01 17:04:43
【问题描述】:

有人告诉我如何在 UWP 移动应用中将焦点从 ViewModel 设置为 TextBox。我的情景是

  1. 用户扫描显示:手动输入的条码
  2. 我的 ViewNodel 将 TextBox.Visibility 上的绑定从 Collapsed 更改为 Visible
  3. 我想触发SetFocusTapped 事件,因此标记位于TextBox 内并显示键盘。

【问题讨论】:

  • 你试过设置焦点吗? small sample
  • 不要尝试仅从 ViewModel 执行此操作。你需要一些以视图为中心的逻辑,而代码隐藏是正确的地方。将一些后台代码绑定到虚拟机上的布尔属性或事件。
  • Henk Holtman 你有什么例子吗?从代码后面的 waths 属性设置 foucs?
  • 没有,但是你看过@Romasz 的小样本吗?
  • 是的,您可以使用 Control.Focus 方法。所以从后面的 xaml 代码中基于这样的情况调用 yourControlName.Focus(FocusState.Programmatic);

标签: uwp template10


【解决方案1】:

虽然 ViewModel 并不真正适合这种情况,但从 ViewModel 设置焦点的最佳方法是为其创建依赖属性,然后绑定到它。

public static class FocusExtension
{
    public static bool GetIsFocused(Control obj)
    {
        return (bool)obj.GetValue(IsFocusedProperty);
    }

    public static void SetIsFocused(Control obj, bool value)
    {
        obj.SetValue(IsFocusedProperty, value);
    }

    public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached(
        "IsFocused", typeof(bool), typeof(FocusExtension),
        new PropertyMetadata(false, OnIsFocusedPropertyChanged));

    private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = (Control)d;

        if ((bool)e.NewValue != (bool)e.OldValue)
        {
            if ((bool)e.NewValue)
            {
                control.Focus(FocusState.Programmatic);
                control.LostFocus += Control_LostFocus;
            }
            else
            {
                control.GotFocus += Control_GotFocus;
            }
        }
    }

    private static void Control_GotFocus(object sender, RoutedEventArgs e)
    {
        var control = (Control)sender;
        control.SetValue(IsFocusedProperty, true);
        control.GotFocus -= Control_GotFocus;
    }

    private static void Control_LostFocus(object sender, RoutedEventArgs e)
    {
        var control = (Control)sender;
        control.SetValue(IsFocusedProperty, false);
        control.LostFocus -= Control_LostFocus;
    }
}

你可以这样绑定(推荐两种方式绑定,因为焦点只会设置一次,因为失去焦点后属性不会被设置回false)

<TextBox extensions:FocusExtension.IsFocused="{Binding IsTextBoxFocused, Mode=TwoWay}"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多