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

Ars*_*lan 4 c# wpf textbox

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

我想要一个像输入/ Alt + Enter行为的Excel,当用户点击"Enter"时,文本框被验证(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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Rac*_*hel 7

如果用户按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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要让NewLine工作,请确保AcceptsReturn="True"你的TextBox