当一个自定义文本框并排放置时,我正试图将它们的焦点设置为验证错误。我在wpf中做了一个CustomTextBox
(从TextBox继承(。
我必须在主xaml文件中一个接一个地保留两个customTextBox。
我该怎么办
现在,在移动选项卡或鼠标单击到任何其他控件或下一个放置的CustomTextBox外部时,它必须显示验证错误,并且如果第一个控件中有错误,则不应失去焦点。
问题出在哪里
当我按下一个选项卡时,它会调用LostKeyboardFocus
事件2次。第一次为第一个CustomTextBox,然后下一次为下一个放置的CustomTextBox(我认为按tab键可以到达那里(。我正在触发这些自定义文本框的LostKeyboardFocus上的文本框绑定,然后检查是否存在已经有效的验证错误。然后我弹出错误消息,它也工作
问题是我必须在验证错误时将注意力集中在第一个CustomTextBox上,而下一个放置的CustomTextBox会再次调用它。
我的代码是(仅相关部分(:
public class CustomTextBox : TextBox
{
public CustomTextBox()
{
this.LostKeyboardFocus += CustomTextBox_LostKeyboardFocus;
}
private void CustomTextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
this.Text = updatedText;
BindingExpression be = this.GetBindingExpression(TextBox.TextProperty);
if (be == null)
{
return;
}
be.UpdateSource(); //triggers binding correctly
if (Validation.GetHasError(this))
{
e.Handled = true;
var errors = Validation.GetErrors(this);// gets validation error
MainLibrary.ShowErrors(errors[0].Exception); //Popups error window
Keyboard.Focus(this);
this.CaretIndex = this.Text.Length;
return;
}
}
}
当存在验证错误时,如何使此CustomTextBox_LostKeyboardFocus不被第二个放置的CustomTextBox调用?
当您显示一个新窗口时,它将被激活。
这意味着它需要聚焦。
因为只有一件事可以集中注意力,所以你拥有的任何其他东西都会失去注意力。
在单独的新窗口中显示错误是个坏主意。
您可以通过设置showactivated false 来缓解这种情况
<Window ...
ShowActivated="False">
除非用户可以点击它。
或者,他们可以点击其他控件,而不是从自定义文本框中跳出来。
这意味着依靠保持专注可能不是一个好主意。
与其进行验证,不如只强制输入有效数据。如果这对你正在做的任何事情都实用的话。