WPF如何在按下Enter键后使文本框失去焦点

16

我创建了一些文本框,希望用户在其中输入十进制值。在我使用过的所有应用程序中,当我在文本框中输入内容并按下回车键后,将接受该值并且文本框失去焦点。如何在我的应用程序中实现这个功能? 我知道可以使用键事件相对容易地实现它,但也许有命令或其他方法。 我在stackoverflow上搜索,但我只找到了关于如何在按下回车键后保持焦点的问题...


通常情况下,您可以使用 Tab 键失去焦点,您可以将按钮设置为确认按钮,并通过 Enter 切换。但是,仅通过按 Enter 从文本框中失去焦点听起来有些奇怪,您可能需要根据自己的建议在键事件中编写代码。 - Kevin DiTraglia
1
奇怪吗?:P那么当您在Web浏览器中输入www地址时怎么办?没有确认按钮,您只需按Enter键即可。 - Dess
1
好的,这是我建议的将回车作为确认的按钮,这会导致取消选择框的副作用。要做到这一点,只需将确认按钮的“IsDefault”属性设置为true即可。 - Kevin DiTraglia
1
我有一排4个文本框,一开始可以通过Tab键在它们之间切换(但是如果我想稍后更改一个文本框中的值,Tab键可能不是最好的选择),但是我的最后一个文本框绑定了滑块,当我输入值并按下回车键时,我希望自动更改滑块中的值。现在我无法做到这一点,因为我需要点击另一个组件以失去焦点,才能接受该值。 - Dess
2
我同意原帖的观点。在一个框中按回车是非常直观的事情。这不是关于纯逻辑,而是关于普通用户的直觉。大多数人会按下回车键,直到某些特殊情况。 - j riv
显示剩余2条评论
1个回答

25

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

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 中使用此类,请将它包含在文本框行为集合中,就像这样:

要在您的 XAML中使用此类,请像以下示例一样将其包括在文本框行为集合中:

-

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

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


1
请注意,在XAML中正确导入“i”命名空间的方式是xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" - cod3monk3y
我可以把这个加入资源文件中吗?这样我就不用一遍又一遍地写了。 - fhnaseer
2
说实话,我对这些建议之所以得到如此之多的分数感到怀疑,仅仅因为它们更符合 "XAML" 的规范。另一种答案只需要一个小函数和每个键的一行代码。而这一个则需要大量使用<i:/>等 XAML 代码来完成每个框,或至少需要另一个不同的解决方案来避免这种情况。 - j riv
完美,这是一个很棒的解决方案。只有一个核心代码。正是我在寻找的。谢谢。 - SQL Police
1
我发现在发送器上使用MoveFocus对我没有用,但是根据这里的答案,将该行更改为在e.OriginalSource上移动焦点可以解决问题。 - mungflesh
显示剩余5条评论

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