wpf 如何取消输入焦点更改?

xam8gpfp  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(179)

在WPF应用程序中,我想实现身份验证逻辑:只有当用户登录时,他才能在对话框中编辑某个文本框。
我想要的是以下行为:
1.如果用户已经登录,他可以像往常一样单击文本框并开始编辑其内容。
1.如果用户没有登录,他应该仍然可以点击文本框,但是他应该在登录对话框中得到提示。在完成登录对话框之后,他应该发现自己回到了文本框中,现在处于编辑模式。
1.如果用户取消登录对话框(没有登录),输入焦点应该移动到包含文本框的对话框的取消按钮,从而防止他编辑文本框的内容。
我试着用这种方式连接到PreviewGotKeyboardFocus事件:

private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        bool loggedIn = ExecuteLogin(); //shows the login dialog and returns new login status

        if (!loggedIn)
        {
            CancelButton.Focus();
             e.Handled = true;
        }
    }

字符串
只要用户完成登录过程,它确实可以正常工作,但是如果用户取消登录对话框,它不会将输入焦点转移到取消按钮。(对话框中的每个文本框一次),而且整个系统看起来一团糟(应用程序的进程在应用程序关闭时不会终止-它必须在之后被杀死)。
我应该改变什么来获得我想要的行为?

bxjv4tth

bxjv4tth1#

下面的示例代码对我来说工作正常。点击中间的文本框,在对话框中回答“否”,然后按[回车]。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private bool _handleEvent = true;
    private void TextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        if (!_handleEvent)
            return;

        bool loggedIn = ExecuteLogin(); //shows the login dialog and returns new login status

        if (!loggedIn)
        {
            CancelButton.Focus();
            e.Handled = true;

        }
    }

    public bool ExecuteLogin() => MessageBox.Show("Login?", "", MessageBoxButton.YesNo) == MessageBoxResult.Yes;

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("click");
    }
}

个字符
请注意,虚线焦点边框仅在您使用键盘导航到Button时才有意显示:
WPF Button to have Keyboard focus (dotted border around) during the startup or activation of window

mnemlml8

mnemlml82#

我认为你应该使用GotFocus事件。
与其总是打开对话框并试图用代码关闭它,难道你不能立即获得日志信息,检查用户是否登录,然后打开或不打开对话框吗?

相关问题