如何避免在wpf中单击按钮时文本框失去焦点?

6

enter image description here

现在光标正在文本框中。如果我点击按钮(RemoveLostFocus),文本框的失去焦点事件会被触发。但是我需要的是,文本框的失去焦点事件不应该被触发。有没有什么方法可以做到这一点?

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        txtUserName.Focus();
    }

private void UserName_LostFocus(object sender, RoutedEventArgs e)
    {
        if (txtUserName.Text.Length < 1)
        {
            MessageBox.Show("UserName should not be empty");
        }
    }

    private void btnCancel_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
                    anotherWindow.Show();
    }

我尝试了一些验证,它会弹出消息窗口。如果我点击名为“取消”的按钮,则该验证部分将被执行。 - CHANDRA
什么情况下应该出现 Text.Length < 0 - LPL
当我聚焦到另一个未在此处提及的文本框时 - CHANDRA
据我所知,Text.Length永远不会小于0。 - LPL
抱歉,文本长度小于1。 - CHANDRA
4个回答

8

Button焦点改变时,您将想要使用附加属性FocusManager将焦点应用于TextBox

示例:

<StackPanel>
    <TextBox Name="txtbx" />
    <Button Content="Click Me!" FocusManager.FocusedElement="{Binding ElementName=txtbx}"/>
</StackPanel>

使用此解决方案,即使在按下按钮时,TextBox也将始终保持聚焦,并且TextBoxLostFocus事件不会被触发。

+1 针对此容器 (on the container) + FocusManager.IsFocusScope - 这是唯一真正有效的解决方案。 - NSGaga-mostly-inactive
我的下一个问题是,如果您想要做与此完全相同的事情(使用TextBox和Button),但是TextBox位于自定义控件上,而Button位于包含该自定义控件的窗口上,该怎么办? - Logan B. Lehman

1
你可以在按钮上设置Focusable =“False”。这里是答案的链接 输入链接描述

-1

1
我使用了你的代码,即使Lostfocus被触发。我将编辑我的真实场景。 - CHANDRA
在您的按钮处理程序中使用 this.Close() 会触发 LostFocus 事件。您想要关闭什么? - LPL
导航到另一个窗口。 - CHANDRA
但是如果您离开窗口,TextBox也会失去焦点。您无法避免这种情况。 - LPL
如果我使用this.Hide()而不是this.Close(),它是可以工作的。当我只有一个窗口时,这时我使用这个代码(this.Hide())意味着应用程序正在运行而不是结束。这是正确的方法吗? - CHANDRA
我认为这不是一个好的设计。不要试图阻止事件的触发以达到你的目标。但我不明白为什么不立即验证你的文本框。我认为这才是用户所期望的。 - LPL

-1
在您的按钮的点击事件中,您可以执行类似以下的操作:
this.textBox.Focus();

如果你的失去焦点方法长这样:
private void UserName_LostFocus(object sender, RoutedEventArgs e){ ... }

您可以使用以下代码来防止失去焦点:

this.textBox.LostFocus -= UserName_LostFocus;

请查看我编辑后的代码。当我点击取消按钮时,文本框的失去焦点事件会触发并执行丢失焦点事件中的逻辑。但是我不想这样。 - CHANDRA

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