WPF TextBox RaiseEvent

时间:2012-05-31 14:57:53

标签: c# wpf textbox raiseevent

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

有没有办法手动触发其中任何一个事件,以便验证有效?

我尝过这样的话:

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

但似乎没有任何效果。我无法让这些类型匹配。欢迎任何想法。

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

3 个答案:

答案 0 :(得分:0)

您可以使用以下代码伪造文本输入到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);

答案 1 :(得分:0)

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

通过这种方式,一旦用户将焦点从文本框移开,验证将会激活。

答案 2 :(得分:0)

要完成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);

希望这会有所帮助