文本框转换发送密钥:Alt + Enter – > Enter

我希望能够修改wpf文本框的行为,而无需实现新类。

我想要一个像输入/ Alt + Enter行为的Excel,当用户点击“Enter”时文本框被validation(movefocus …),但当他点击“ALT + Enter”时,文本框必须添加一个新行(my textbox支持多行:AcceptsReturn为true)。

我已经尝试过(在文本框中的PreviewKeyDown事件): – 在此链接之后构建一个KeyEventArgs和一个TextCompositionEventArgs: 如何在C#中以编程方式生成keypress事件? – 我尝试过SendKeys.SendWait(“{ENTER}”)但它发送了许多新的行命令

有没有办法做到这一点 ?

谢谢

private void m_MeasurementName_PreviewKeyDown(object sender, KeyEventArgs e) { var tb = (sender as TextBox); if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter)) { // 1st try var key = "\n\r"; var routedEvent = Keyboard.KeyDownEvent; tb.RaiseEvent(new TextCompositionEventArgs(InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, tb, key)) { RoutedEvent = routedEvent }); // 2nd var key = Key.Enter; var routedEvent = TextCompositionManager.TextInputEvent; tb.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(tb), 0, key) { RoutedEvent = routedEvent }); // 3rd System.Windows.Forms.SendKeys.SendWait("{ENTER}"); // 4th Strangely works but not ... you know MessageBox.Show("ALT+ENTER"); e.Handled = true; } else if (Keyboard.IsKeyDown(Key.Enter)) { tb.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); e.Handled = true; } } 

如果用户按下Alt + Enter,只需在现有的TextBox.Text上添加一个新行。 如果他们只按Enter键,则在文本绑定上触发UpdateSource

 private void m_MeasurementName_PreviewKeyDown(object sender, KeyEventArgs e) { var tb = (sender as TextBox); if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter)) { tb.Text += "\r\n"; tb.SelectionStart = tb.Text.Length; e.Handled = true; } else if (Keyboard.IsKeyDown(Key.Enter)) { var textBinding = BindingOperations.GetBindingExpression( tb, TextBox.TextProperty); if (textBinding != null) textBinding.UpdateSource(); e.Handled = true; } } 

要使NewLine工作,请确保TextBox上的AcceptsReturn="True"