WPF: 文本框未触发onTextInput事件

15

基本上,我有一堆文本框,用户可以填写。我有一个按钮,我希望在所有文本框都输入文本之前保持禁用状态。这是我正在使用的示例XAML文本框:

<TextBox Name="DelayedRecallScore" TextInput="CheckTextBoxFilled" Width="24" />

这里是我试图触发的函数:

  //Disables the OK button until all score textboxes have content
    private void CheckTextBoxFilled(object sender, RoutedEventArgs e)
    {
        /*
        foreach (TextBox scorebox in TextBoxList)
        {
            if (string.IsNullOrEmpty(scorebox.Text))
            {
                Ok_Button.IsEnabled = false;
                return;
            }
        }
        Ok_Button.IsEnabled = true;
         */
        MessageBox.Show("THIS MAKES NO SENSE");
    }

当TextInput应该被触发时,MessageBox没有显示出来。作为一个实验,我尝试在PreviewTextInput上触发CheckTextBoxFilled(),然后它就正常工作了,这意味着由于某种原因,函数没有被调用。我还有一个通过PreviewTextInput触发的验证函数,它按预期工作。起初,我以为PreviewTextInput可能会干扰TextInput,所以我将PreviewTextInput从TextBox中移除,但这并没有解决任何问题。我对为什么会发生这种情况感到完全困惑,因此任何帮助都将不胜感激。


多播委托发生了什么?为什么它不会触发用户分配的事件以及自己的事件呢? - Sonic Soul
4个回答

16

你的 TextInput 事件处理程序没有被触发,因为 TextBox 已经处理了该事件。你可以尝试使用 TextChanged 事件,因为你只想知道什么时候字符被添加或从 TextBox 中删除。


3
我不知道这一点,谢谢。我之前以为由于PreviewTextInput的工作方式,TextInput也会以相同的方式运作。但是TextChanged完全可以正常工作。 - Kay Ell
2
WPF 真的很喜欢把本应简单的任务搞得过于复杂化。我的意思是,如果一个事件永远不会被触发,为什么要暴露它呢?荒谬...是啊,我在发泄 :D - Ed S.
@Ed FWIW,如果你子类化TextBox,那么你可以处理事件。但我确实理解你的观点。 - Andy
是的,总有一些变通方法,而且我通常很喜欢WPF,但在最近的项目中,由于框架使本应简单的事情变得过于困难,我被咬了很多次,所以我有点感到沮丧。 - Ed S.

8
InitializeComponent();
textbox.AddHandler(TextBox.TextInputEvent, 
                   new TextCompositionEventHandler(TextBox_TextInput_1), 
                   true);

事件未被触发。 - Mike

2
请使用“PreviewTextInput”替代,这样会起作用。

0
创建一个继承自TextBox的新类。在新类中重写OnTextInput方法。你的OnTextInput方法将在TextBox之前被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接