Отмена буфера очищается после обработки OnKeyDown в TextBox - PullRequest
0 голосов
/ 11 июля 2011

Я создаю подкласс TextBox:

class Editor : TextBox

Я переопределил OnKeyDown, потому что я хочу, чтобы вкладки были заменены четырьмя пробелами:

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

Это работает, но, к сожалению, это также очищаетбуфер отмены.Конечным результатом является то, что, когда пользователь нажимает на вкладку, Ctrl + Z не работает, и «Отмена» в контекстном меню становится отключенным.Похоже, проблема заключается в «e.SuppressKeyPress = true;»part.

Кто-нибудь знает, как обойти это?

Для получения дополнительной информации я создаю довольно простой текстовый редактор, и я работаю не только с клавишей Tab (как указано выше), но также клавиша Enter.Так что у меня есть эта проблема с Tab и Enter.Я знаю, что этой проблемы не существует с RichTextBox, но по разным причинам я хочу вместо этого использовать TextBox.

Любая помощь будет принята с благодарностью, так как это проблема остановки моего проекта.

Спасибо, Том

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

Это не результат переопределения OnKeyDown, это то, что вы устанавливаете SelectedText (любая модификация текста будет иметь тот же эффект). Вы можете увидеть это, закомментировав свой код, который устанавливает SelectedText, оставляя все остальное. Очевидно, вы не получите вкладку или четыре символа, но буфер отмены будет сохранен.

Согласно этой записи в блоге , вы должны иметь возможность использовать функцию Paste(string) вместо установки свойства SelectedText и сохранить буфер отмены:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab) 
    {
        Paste("    ");
        e.SuppressKeyPress = true;
    }
}
0 голосов
/ 19 июля 2011

Я наконец нашел решение, которое заключается в использовании 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...