以编程方式调用PreviewTextInput不调用TextChanged事件

时间:2012-11-06 14:47:09

标签: c#

我有一个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更新。

1 个答案:

答案 0 :(得分:0)

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

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