WPF 文本框 RaiseEvent

Posted

技术标签:

【中文标题】WPF 文本框 RaiseEvent【英文标题】:WPF TextBox RaiseEvent 【发布时间】:2012-06-05 20:34:57 【问题描述】:

我有一些使用掩码的验证代码以及文本框上的 PreviewTextInput 和 PreviewKeyDown 事件。当我手动更改文本框中的值时,验证工作完美。当我以编程方式设置值时,验证不会开始,直到我单击框并删除一个字符并重新添加它,手动触发上述一个或两个事件。

有没有办法手动触发这些事件中的任何一个以使验证生效?

我尝试过类似的东西:

this.TextBox.RaiseEvent(this.TextBox.PreviewTextInput);

但似乎没有任何效果。我也找不到匹配的类型。欢迎任何想法。

我正在使用的基于掩码的验证代码可以在这里看到:How to define TextBox input restrictions?

【问题讨论】:

我不确定您要实现什么,但您可以将文本绑定模式修改为UpdateSourceTrigger=Explicit。这样您就可以准确地告诉 WPF 何时更新源,这应该 也更新验证。但是为什么不使用内置验证呢? 我不认为伪造文本框事件是解决这里问题的正确方法。 我认为是,除非您有其他建议。我没有使用真正的验证。我正在使用掩蔽。我的代码在这里:***.com/questions/1103765/… 【参考方案1】:

要完成Trevor Elliott 的回答,我必须重复使用相同的TextCompositionEventArgs 引用才能使其工作:

    TextCompositionEventArgs eventArgs =
      new TextCompositionEventArgs(
        InputManager
          .Current
          .PrimaryKeyboardDevice,
        new TextComposition(
          InputManager.Current, 
          target, 
          ((char) KeyInterop.VirtualKeyFromKey(KBB.Key)).ToString()));

    eventArgs.RoutedEvent = TextCompositionManager.PreviewTextInputStartEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.TextInputStartEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.PreviewTextInputEvent;
    target.RaiseEvent(eventArgs);

    eventArgs.RoutedEvent = TextCompositionManager.TextInputEvent;
    target.RaiseEvent(eventArgs);

希望对你有帮助

【讨论】:

【参考方案2】:

您可以使用以下代码来伪造文本输入到 TextBox。

TextCompositionEventArgs args = new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, txtBox, "Test text")
);
args.RoutedEvent = TextCompositionManager.PreviewTextInputEvent;

txtBox.RaiseEvent(args);

args = new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, txtBox, "Test text")
);
args.RoutedEvent = TextCompositionManager.TextInputEvent;

txtBox.RaiseEvent(args);

【讨论】:

这行得通,但由于某种原因,我设置的验证总是返回 false,直到您手动修改值。【参考方案3】:

或者您可以在通过代码输入文本后选择文本框中的文本,例如 t.Select()。

这样,一旦用户将焦点从文本框移开,验证就会触发。

【讨论】:

以上是关于WPF 文本框 RaiseEvent的主要内容,如果未能解决你的问题,请参考以下文章

wpf 多线程 对文本框赋值

WPF例2-一个文本框实时显示另一个文本框的内容

在 wpf 中的自定义样式上,文本框的文本始终为空

从C#中的WPF组合框或文本框获取文本

WPF - 根据另一个文本框值更改文本框值[重复]

如何在没有焦点的情况下突出显示/选择 wpf 文本框中的文本?