0

我有一个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事件触发并修复功能,但是如果主应用程序有焦点,它会导致两个文本框在仅按下一个按钮时得到更新。

4

1 回答 1

0

我无法弄清楚如何从 调用TextChanged事件PreviewTextInput,但我确实设法完成了我需要做的事情:

我没有执行逻辑来验证按下的键在PreviewTextInput事件内部是否有效,而是将所有逻辑提取出来并将其放入公共函数中。然后在我的ImageEventController_OnKeyPress事件中,我正在使用该LogicalTreeHelper.GetParent()方法来找到必要的控制。从那里我调用公共函数来验证是否按下了有效键,如果是,我TextInput直接调用。

于 2012-11-07T22:13:55.323 回答