如何取消输入焦点更改?

时间:2017-01-27 07:38:39

标签: c# wpf authentication

在WPF应用程序中,我想实现身份验证逻辑:只有用户登录时,他才能在对话框中编辑某个文本框。

我想要的是以下行为:

  1. 如果用户已登录,则可以单击文本框并开始 像往常一样编辑其内容。

  2. 如果用户未登录,他仍然可以单击文本框,但应该在登录对话框中提示他。完成后 登录对话框,他应该发现自己回到文本框中,现在进入 编辑模式。

  3. 如果用户取消登录对话框(未登录),则输入焦点应移至 因此,包含文本框的对话框的“取消”按钮 阻止他编辑文本框的内容。

  4. 我试过用这种方式挂钩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;
            }
        }
    

    只要用户完成登录过程,它确实可以正常工作,但如果他取消登录对话框,则不会将输入焦点传输到取消按钮。此外,事件处理程序被多次调用(对话框中的每个文本框一次),整个系统似乎搞砸了(当应用程序关闭时,应用程序的进程不会终止 - 之后必须将其终止) )。

    我应该改变什么以获得我想要的行为?

2 个答案:

答案 0 :(得分:1)

以下示例代码对我有效。单击中间的TextBox,在对话框中回答“否”,然后按[enter]。

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");
    }
}
<StackPanel>

    <TextBox  />
    <TextBox PreviewGotKeyboardFocus="TextBox_PreviewGotKeyboardFocus" />
    <TextBox />

    <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" />
</StackPanel>

请注意,如果您使用键盘导航到按钮,则只会有意显示虚线对焦边框:

WPF Button to have Keyboard focus (dotted border around) during the startup or activation of window

当您提出问题时,您还应始终记住创建一个Minimal,Complete和Verifiable示例:https://stackoverflow.com/help/mcve

答案 1 :(得分:0)

我认为你应该使用GotFocus事件。

不是总是打开对话框并尝试用代码关闭它,而不是立即获取日志信息,检查用户是否已登录,然后打开或不打开对话框?