0

当它们彼此相邻放置时,我试图将自定义文本框的焦点设置在验证错误上。我CustomTextBox在 wpf 中做了一个(从 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?

4

1 回答 1

0

当您显示一个新窗口时,它将激活。

这意味着它需要重点。

因为只有一件事可以有焦点,所以你拥有的其他任何东西都会失去焦点。

在单独的新窗口中显示错误是一个坏主意。

您可以通过设置 showactivate false 来缓解这种情况

<Window ...
     ShowActivated="False">

除了用户可以点击它。

或者,他们可以单击其他控件,而不是从您的自定义文本框中跳出。

这意味着依靠保持专注可能不是一个好主意。

您可能会更好地强制仅输入有效数据而不是验证。如果这对你正在做的任何事情都是实用的。

于 2020-10-21T14:25:25.270 回答