【问题标题】:Undo buffer getting cleared after handling OnKeyDown in TextBox在 TextBox 中处理 OnKeyDown 后,撤消缓冲区被清除
【发布时间】:2011-07-20 00:06:38
【问题描述】:

我正在继承 TextBox:

class Editor : TextBox

我已经覆盖了 OnKeyDown,因为我希望将制表符替换为四个空格:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab) {
        SelectedText = "    ";
        e.SuppressKeyPress = true;
    }
}

这可行,但不幸的是它也会清除撤消缓冲区。最终结果是,当用户按下 Tab 时,Ctrl+Z 不起作用,并且右键菜单上的“撤消”被禁用。问题似乎是“e.SuppressKeyPress = true;”部分。

有人知道如何解决这个问题吗?

有关更多信息,我正在创建一个相当简单的文本编辑器,我不仅处理 Tab 键(如上),还处理 Enter 键。所以我对 Tab 和 Enter 有这个问题。我知道 RichTextBox 不存在这个问题,但出于各种原因,我想改用 TextBox。

任何帮助都将不胜感激,因为这是我的项目中的一个显示停止问题。

谢谢, 汤姆

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    这不是覆盖OnKeyDown 的结果,而是您设置了SelectedText(任何文本修改都会产生相同的效果)。您可以通过注释掉设置SelectedText 的代码来查看这一点,同时保留其他所有内容。显然你不会得到一个制表符或四个字符,但会保留撤消缓冲区。

    根据this blog post,您应该能够使用Paste(string) 函数而不是设置SelectedText 属性并保留撤消缓冲区:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab) 
        {
            Paste("    ");
            e.SuppressKeyPress = true;
        }
    }
    

    【讨论】:

    • 谢谢。这似乎解决了这个问题,虽然它有一个副作用:使用 Tab 后按 Ctrl+Z 只会撤消自 Tab 插入以来发生的事情。例如,键入“abc[space]def”并按 Ctrl+Z 会产生“”,而键入“abc[tab]def”并按 Ctrl+Z 会产生“abc”。不过,这可能无关紧要;我会明白的。无论如何,我想没有办法避免这种情况。谢谢你的回答。
    【解决方案2】:

    我终于找到了解决办法,就是使用Windows API如下:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Tab) {
            WinApi.SendMessage(Handle, WinApi.WmChar, WinApi.VkSpace, (IntPtr)4);
            e.SuppressKeyPress = true;
        }
        base.OnKeyDown(e);
    }
    

    这是我的 WinApi 类:

    using System;
    using System.Runtime.InteropServices;
    
    class WinApi
    { 
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
    
        public const           UInt32 WmChar  =         0x102;
        public static readonly IntPtr VkSpace = (IntPtr)0x20;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多