问题描述
我试图将自定义文本框的焦点放在验证错误上,当它们彼此相邻放置时。我在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不会调用此CustomTextBox_LostKeyboardFocus?
解决方法
显示新窗口时,它将激活。
这意味着需要关注。
由于只有一件事可以具有焦点,因此您拥有的其他任何事物都会失去焦点。
在单独的新窗口中显示错误不是一个好主意。
您可以通过设置showactivated false来缓解这种情况
<Window ...
ShowActivated="False">
除了用户可以单击之外。
或者,为此,他们可以单击其他控件,而不是远离自定义文本框。
这取决于保持焦点可能不是一个好主意。
您可能会更好地强制仅输入有效数据而不是进行验证。如果这对您所做的一切都是可行的。