在WPF应用程序中,我想实现身份验证逻辑:只有用户登录时,他才能在对话框中编辑某个文本框。
我想要的是以下行为:
如果用户已登录,则可以单击文本框并开始 像往常一样编辑其内容。
如果用户未登录,他仍然可以单击文本框,但应该在登录对话框中提示他。完成后 登录对话框,他应该发现自己回到文本框中,现在进入 编辑模式。
如果用户取消登录对话框(未登录),则输入焦点应移至 因此,包含文本框的对话框的“取消”按钮 阻止他编辑文本框的内容。
我试过用这种方式挂钩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;
}
}
只要用户完成登录过程,它确实可以正常工作,但如果他取消登录对话框,则不会将输入焦点传输到取消按钮。此外,事件处理程序被多次调用(对话框中的每个文本框一次),整个系统似乎搞砸了(当应用程序关闭时,应用程序的进程不会终止 - 之后必须将其终止) )。
我应该改变什么以获得我想要的行为?
答案 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
事件。
不是总是打开对话框并尝试用代码关闭它,而不是立即获取日志信息,检查用户是否已登录,然后打开或不打开对话框?