【问题标题】:WPF how to make textbox lose focus after hitting enterWPF如何让文本框在点击回车后失去焦点
【发布时间】:2014-06-30 01:26:20
【问题描述】:

我创建了一些文本框,我希望用户在其中输入十进制值。在我曾经使用过的每个应用程序中,当我在文本框中输入内容并按 Enter 时,该值被接受并且文本框失去焦点。我怎样才能在我的应用程序中做到这一点? 我知道用一个关键事件来做应该相对容易,但也许有一个命令什么的。 我搜索了stackoverflow,但我只发现了关于如何在按回车后保持焦点的问题......

【问题讨论】:

  • 一般使用tab来失去焦点,可以设置按钮为确认按钮,回车切换。但是,只是因为按 Enter 键而失去对文本框的关注对我来说听起来很奇怪,您可能需要按照您的建议在关键事件中自己编写代码。
  • 奇怪?:P 那么当你在浏览器中输入 www 地址时呢?没有确认按钮,您只需按 Enter。
  • 对,这是我建议的确认输入的按钮,它会产生取消选择框的副作用。为此,只需将确认按钮设置为将 IsDefault 属性设置为 true。
  • 我连续有 4 个框,我可以先用 tab 浏览它们(但是如果我想稍后只在一个文本框中更改值,tab 不是最好的选择),但是我的最后一个文本框绑定到滑块,当我输入值并按回车键时,我想自动更改滑块中的值。我现在不能这样做,因为我需要通过单击另一个组件来失去焦点才能接受该值。
  • 我和 OP 在一起。在框上按 Enter 是一件非常直观的事情。这不是纯粹的逻辑,而是普通用户的直觉。他们中的大多数人会按回车键,直到在某些情况下。

标签: c# wpf textbox focus


【解决方案1】:

您还可以创建一个通用行为,该行为可以轻松应用于应用程序中的任何文本框。这是一个示例行为类:-

public class TextBoxEnterKeyUpdateBehavior : Behavior<TextBox>
{        
    protected override void OnAttached()
    {
        if (this.AssociatedObject != null)
        {
            base.OnAttached();
            this.AssociatedObject.KeyDown += AssociatedObject_KeyDown;
        }
    }

    protected override void OnDetaching()
    {
        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.KeyDown -= AssociatedObject_KeyDown;
            base.OnDetaching();
        }
    }

    private void AssociatedObject_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox != null)
        {
            if (e.Key == Key.Return)
            {
                if (e.Key == Key.Enter)
                {
                    textBox.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            }
        }
    }
}

要在您的 xaml 中使用此类,只需将其包含在文本框行为集合中,如下所示:-

<TextBox>
    <i:Interaction.Behaviors>
           <TextBoxEnterKeyUpdateBehavior />
    </i:Interaction.Behaviors>
</TextBox>

这里的“i”指的是 System.Windows.Interactivity 命名空间。

【讨论】:

  • 请注意,在 XAML 中正确导入 i 命名空间是 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
  • 我可以在资源文件中添加这个吗?这样我就不用一遍又一遍地写了,
  • 老实说,我对这些建议获得的大量分数表示怀疑,仅仅是因为它们更“XAML-y”。另一个答案是单个小功能和每个键的一行。这需要为每个盒子提供大量的 xaml 垃圾邮件,或者至少需要一个额外的不同解决方案来避免这种情况。
  • 完美,这是一个很好的解决方案。一段核心代码。正是我想要的。谢谢。
  • 我发现发件人上的MoveFocus 对我不起作用,但根据here 的答案将e.OriginalSource 上的行更改为MoveFocus 确实
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2013-06-13
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多