c# - 文本框转换发送 key : Alt + Enter -> Enter

标签 c# wpf textbox

我希望能够在不需要实现新类的情况下修改 wpf 文本框的行为。

我想要一个类似 Enter/Alt+Enter 行为的 Excel,当用户点击“Enter”时,文本框被验证(movefocus ...),但是当他点击“ALT+Enter”时,文本框必须添加一个新的行(我的文本框支持多行:AcceptsReturn 为真)。

我试过了(在文本框 PreviewKeyDown 事件中): - 通过此链接构建 KeyEventArgs 和 TextCompositionEventArgs:How can I programmatically generate keypress events in C#? - 我试过 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,则在文本绑定(bind)上触发 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 正常工作,请确保 AcceptsReturn="True" 在您的 TextBox

关于c# - 文本框转换发送 key : Alt + Enter -> Enter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139420/

相关文章:

c# - 如何使用 .NET CORE 获取存储过程的实际结果?

c# - 无法从媒体库获取图片

c# - 如何更改 WPF/C# 密码框的背景颜色

excel - 突出显示用户表单文本框中的文本

c# - 从文本框 C# 获取行索引

c# - 正则表达式模型验证 : Whole Number or Decimal Multiples of . 25

c# - 为什么锁定同一对象不会导致死锁?

c# - 我是 .Net、C# 和 WPF 程序员。 Expression Blend 值得吗?

wpf - 是否可以在 Windows 7 Embedded 上运行 .NET core 3.1 应用程序?

asp.net - 如何在asp.net中的gridview中检索文本框值