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的主要内容,如果未能解决你的问题,请参考以下文章