【问题标题】:Textbox convert sent key : Alt + Enter -> Enter文本框转换发送键:Alt + Enter -> Enter
【发布时间】:2011-11-15 16:12:26
【问题描述】:

我希望能够修改 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;
        }
    }

【问题讨论】:

  • 能否请您提供textBox PreviewKeyDown 例程中的代码,以便我们有机会为您提供更好的帮助?
  • 嗯,你不能将一个简单的“\n”字符连接到当前文本吗?

标签: c# wpf textbox


【解决方案1】:

如果用户按下 Alt+Enter,只需在现有 TextBox.Text 上添加一个新行。如果他们只按 Enter,则在 Text Binding 上触发 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

【讨论】:

  • 它有效,但我现在感觉很愚蠢:(顺便说一句,插入符号是第一个,但我已经通过添加 tb.SelectionStart = tb.Text.Length; 在 tb.Text += 之后修复它。 ..,现在carret在最后一个位置
  • @Arslan 别担心,我相信每个人都会在某些时候过度思考问题。很高兴它可以工作,我会将您的评论添加到我的答案中:)
猜你喜欢
  • 2022-01-17
  • 2010-12-02
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多