Программно имитировать событие KeyDown для RichTextBox в C # 2010 - PullRequest
1 голос
/ 06 сентября 2010

У меня есть RichTextBox в моей форме, и я хочу использовать поведение по умолчанию, как RichTextBox, например, Ctrl + Z (Отменить) или другие действия (Ctrl + Y, Ctrl + X, Ctrl + V).

Если пользователи используют сочетания клавиш (Ctrl + Z), это прекрасно.Но что, если пользователи щелкают ToolStripButton?

Как программно моделировать событие KeyDown для RichTextBox в C # 2010.

Вот фрагмент кода, в котором есть некоторые проблемы.Можете ли вы помочь мне, как симулировать / RaiseEvent в C #?

private void tsbUndo_Click(object sender, EventArgs e)
{
    rtbxContent_KeyDown(rtbxContent, new KeyEventArgs(Keys.Control | Keys.Z));
}

private void tsbPaste_Click(object sender, EventArgs e)
{
    DoPaste();
}

private void DoPaste()
{
    rtbxContent.Paste(DataFormats.GetFormat(DataFormats.UnicodeText));
}

private void rtbxContent_KeyDown(object sender, KeyEventArgs e)
{
    //if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
    if (e.Control)
    {
        switch (e.KeyCode)
        {
            // I want my application use my user-defined behavior as DoPaste() does
            case Keys.V:
                DoPaste();
                e.SuppressKeyPress = true;
                break;

            // I want my application use the default behavior as the RichTextBox control does
            case Keys.A:
            case Keys.X:
            case Keys.C:
            case Keys.Z:
            case Keys.Y:
                e.SuppressKeyPress = false;
                break;

            default:
                e.SuppressKeyPress = true;
                break;
        }
    }
}

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

RichTextBox имеет метод Undo, который будет делать то же самое, что и CTRL + Z .Вы можете позвонить, когда нажмете ToolStribButton.Существуют также методы Copy и Paste вместе с методом CanPaste, которые можно использовать для включения / отключения ToolStripButton, соответствующего команде вставки.

Таким образом, вам не нужноимитировать все что угодно, но вместо этого вызывать функциональность, которая производит поведение.В конце концов, нажатие клавиш - это всего лишь триггеры для такого поведения.

0 голосов
/ 06 сентября 2010

Да, это может быть сделано без написания специального RichTextBox.Вместо вызова метода Paste () в RichTextBox, вы можете использовать класс SendKeys , который будет запускать ключевые события для элемента управления

private void DoPaste()
{
    rtbxContent.Focus(); // You should check to make sure the Caret is in the right place
    SendKeys.Send("^V"); // ^ represents CTRL, V represents the 'V' key
}

Это, конечно, предполагает, что ваши данныехранится в буфере обмена.

...