我有一个TextBox
,只允许输入某些字符;我正在PreviewTextInput
事件中处理此逻辑。如果它是允许的字符,则会触发TextChanged
事件,否则会取消TextChanged
事件。
我有另一个应用程序在运行时在第二个屏幕上打开,但是即使在其他应用程序处于活动状态时有键盘输入,它仍应更新主应用程序上当前关注的TextBox
。为此,我在第二个应用程序的OnKeyPress()
事件中添加了一个侦听器,该事件在主应用程序中的焦点PreviewTextInput
上调用TextBox
事件。
以下是代码:
private void ImageEventController_OnKeyPress(char c)
{
object focusedElement = this.CurrentKeyboardFocus;
if (focusedElement != null)
{
if (focusedElement is TextBox)
{
TextBox target = (TextBox)focusedElement;
if (target.IsEnabled)
{
string text = c.ToString();
var routedEvent = TextCompositionManager.PreviewTextInputEvent;
target.RaiseEvent(new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text)) { RoutedEvent = routedEvent });
}
}
}
}
当调用它时,它会经历PreviewTextInput
事件,但TextChanged
事件永远不会被触发,即使它是有效字符。在以编程方式调用TextChanged
时,是否有任何理由导致PreviewTextInput
未被触发?
更新:
我在此代码中添加了PreviewTextInput
事件监听器的底部:
if (!e.Handled)
{
textbox.Text = e.Text;
}
这会强制TextChanged
事件在第二个应用程序具有焦点时触发并修复功能,但是如果主应用程序具有焦点,则只需按一个按钮就会导致两个TextBox更新。
答案 0 :(得分:0)
我无法弄清楚如何从TextChanged
调用PreviewTextInput
事件,但我确实设法完成了我需要做的事情:
我没有执行逻辑来验证按下的键在PreviewTextInput
事件中是有效的,而是将所有逻辑拉出并将其放入公共函数中。然后在我的ImageEventController_OnKeyPress
事件中,我使用LogicalTreeHelper.GetParent()
方法找到必要的控件。从那里我调用公共函数来验证是否按下了有效键,如果是,我直接调用TextInput
。