Подтвердить что ты не робот

Включить копирование, вырезание, прошлое окно в расширенном текстовом поле

У меня есть богатое текстовое поле (richTextBox1) в моей программе, как показано ниже. Но когда я нажимаю на него правой кнопкой мыши, он не появляется окно "копировать, вырезать, прошло". Не могли бы вы рассказать мне, как я могу включить это окно "копировать, вырезать, прошлое" в свой Rich Text Box? Я новичок в С#, пожалуйста, дайте мне знать шаг за шагом, если вы знаете, как решить эту проблему.

enter image description here

4b9b3361

Ответ 1

Попробуйте с этим кодом

UPDATED CODE:

        private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {   //click event
                //MessageBox.Show("you got it!");
                ContextMenu contextMenu = new System.Windows.Forms.ContextMenu();
                MenuItem menuItem = new MenuItem("Cut");
                menuItem.Click += new EventHandler(CutAction);
                contextMenu.MenuItems.Add(menuItem);
                menuItem = new MenuItem("Copy");
                menuItem.Click += new EventHandler(CopyAction);
                contextMenu.MenuItems.Add(menuItem);
                menuItem = new MenuItem("Paste");
                menuItem.Click += new EventHandler(PasteAction);
                contextMenu.MenuItems.Add(menuItem);

                richTextBox1.ContextMenu = contextMenu;
            }
        }
        void CutAction(object sender, EventArgs e)
        {
            richTextBox1.Cut();
        }

        void CopyAction(object sender, EventArgs e)
        {
            Graphics objGraphics;
            Clipboard.SetData(DataFormats.Rtf, richTextBox1.SelectedRtf);
            Clipboard.Clear();
        }

        void PasteAction(object sender, EventArgs e)
        {
            if (Clipboard.ContainsText(TextDataFormat.Rtf))
            {
                richTextBox1.SelectedRtf
                    = Clipboard.GetData(DataFormats.Rtf).ToString();
            }
        } 

если вы хотите скопировать вставку с другим приложением, например записной книжкой (without styles ), замените следующие методы

       void CopyAction(object sender, EventArgs e)
        {
            Clipboard.SetText(richTextBox1.SelectedText);
        }

        void PasteAction(object sender, EventArgs e)
        {
            if (Clipboard.ContainsText())
            {
                richTextBox1.Text
                    += Clipboard.GetText(TextDataFormat.Text).ToString();
            }
        }  

Ответ 2

Если у вас более одного RichTextBox, вы можете использовать этот метод расширения:

    public static void AddContextMenu(this RichTextBox rtb)
    {
        if (rtb.ContextMenuStrip == null)
        {
            ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false };
            ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
            tsmiCut.Click += (sender, e) => rtb.Cut();
            cms.Items.Add(tsmiCut);
            ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
            tsmiCopy.Click += (sender, e) => rtb.Copy();
            cms.Items.Add(tsmiCopy);
            ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
            tsmiPaste.Click += (sender, e) => rtb.Paste();
            cms.Items.Add(tsmiPaste);
            rtb.ContextMenuStrip = cms;
        }
    }

И используйте его следующим образом: richTextBox1.AddContextMenu();

Ответ 3

Стандартный RichTextBox не содержит контекстного меню для вырезания, копирования и вставки. Тем не менее, вы можете посмотреть эту статью, которая содержит полный код, необходимый для реализации вашего собственного!

Ответ 4

Я думаю, что решение, предоставляемое Thilina H, отлично, за исключением нескольких ошибок.

  • Событие MouseUp вызывает щелчок правой кнопкой мыши для запуска после второго щелчка. Я рекомендую использовать MouseDown событие вместо MouseUp.

  • Во втором случае я тестировал метод CopyAction. В моем случае CopyAction метод не копировал символы ввода. Мне пришлось изменить код следующим образом:

    Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
    
  • Когда richTextBox1.SelectedText пуст, программа обнаружила исключение. Я просто отредактировал метод CopyAction, показанный ниже, чтобы устранить проблему.

        if (chatBox.SelectedText != null && chatBox.SelectedText != "")
        {
            Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n"));
        }
    

Счастливое кодирование!

Ответ 5

В случае, если вам нужно добавить стандартное контекстное меню для нескольких экземпляров RichTextBox, тогда может быть лучше создать пользовательский расширенный компонент, унаследованный от RichTextBox. Новый компонент можно добавить из контекстного меню проекта Solution Explorer Add → New Item... → Custom Control.

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

Также полезно поддерживать другие полезные стандартные действия, такие как Отмена, Повторить, Удалить и Выбрать все.

namespace Common
{
    public partial class RichTextBoxEx : RichTextBox
    {
        public RichTextBoxEx()
        {
            AddContextMenu();
        }

        public void AddContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false };

            ToolStripMenuItem tsmiUndo = new ToolStripMenuItem("Undo");
            tsmiUndo.Click += (sender, e) => { if (CanUndo) Undo(); };
            tsmiUndo.ShortcutKeys = Keys.Z | Keys.Control;
            cms.Items.Add(tsmiUndo);

            ToolStripMenuItem tsmiRedo = new ToolStripMenuItem("Redo");
            tsmiRedo.Click += (sender, e) => { if (CanRedo) Redo(); };
            tsmiRedo.ShortcutKeys = Keys.Y | Keys.Control;
            cms.Items.Add(tsmiRedo);

            cms.Items.Add(new ToolStripSeparator());

            ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
            tsmiCut.Click += (sender, e) => Cut();
            tsmiCut.ShortcutKeys = Keys.X | Keys.Control;
            cms.Items.Add(tsmiCut);

            ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
            tsmiCopy.Click += (sender, e) => Copy();
            tsmiCopy.ShortcutKeys = Keys.C | Keys.Control;
            cms.Items.Add(tsmiCopy);

            ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
            tsmiPaste.Click += (sender, e) => Paste();
            tsmiPaste.ShortcutKeys = Keys.V | Keys.Control;                
            cms.Items.Add(tsmiPaste);

            ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("Delete");
            tsmiDelete.Click += (sender, e) => { SelectedText = ""; };                                
            cms.Items.Add(tsmiDelete);

            cms.Items.Add(new ToolStripSeparator());

            ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All");
            tsmiSelectAll.Click += (sender, e) => { SelectionStart = 0; SelectionLength = Text.Length; };
            tsmiSelectAll.ShortcutKeys = Keys.A | Keys.Control;
            cms.Items.Add(tsmiSelectAll);

            cms.Opening += delegate (object sender, CancelEventArgs e) 
            {
                tsmiUndo.Enabled = CanUndo && !this.ReadOnly;
                tsmiRedo.Enabled = CanRedo && !this.ReadOnly;
                tsmiCut.Enabled = (SelectionLength != 0) && !this.ReadOnly;
                tsmiCopy.Enabled = SelectionLength != 0;
                tsmiPaste.Enabled = Clipboard.ContainsText() && !this.ReadOnly;
                tsmiDelete.Enabled = (SelectionLength != 0) && !this.ReadOnly;
                tsmiSelectAll.Enabled = (TextLength > 0) && (SelectionLength < TextLength);
            };

            ContextMenuStrip = cms;
        }
    }
}

Ответ 6

Я просто хочу добавить к Thilina H ответ (тот, который был отмечен как правильный ответ на плакат) Вот мои функции копирования и вставки. Они немного больше, чем блокнот.

void CopyAction(object sender, EventArgs e)
{
    if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
    {
        Clipboard.SetText(richTextBox1.SelectedText);
    }
}

void PasteAction(object sender, EventArgs e)
{
    if (Clipboard.ContainsText())
    {
        int selstart = richTextBox1.SelectionStart;
        if (richTextBox1.SelectedText != null && richTextBox1.SelectedText != "")
        {
            richTextBox1.Text = richTextBox1.Text.Remove(selstart, richTextBox1.SelectionLength);
        }

        string clip = Clipboard.GetText(TextDataFormat.Text).ToString();
        richTextBox1.Text = richTextBox1.Text.Insert(selstart, clip);
        richTextBox1.SelectionStart = selstart + clip.Length;
    }
}

Я надеюсь, что это кому-то поможет;

Ответ 7

Благодаря @Jaex

fooobar.com/info/218515/...

fooobar.com/info/105194/...

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
    internal static extern IntPtr GetFocus();

    private Control GetFocusedControl()
    {
        Control focusedControl = null;
        // To get hold of the focused control:
        IntPtr focusedHandle = GetFocus();
        if (focusedHandle != IntPtr.Zero)
            // Note that if the focused Control is not a .Net control, then this will return null.
            focusedControl = Control.FromHandle(focusedHandle);
        return focusedControl;
    }

    private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
    {

        if (Clipboard.ContainsText())
        {
            var FocusedControl = GetFocusedControl();

            if (FocusedControl != null)
                switch (FocusedControl.GetType().Name)
                {
                    case "RichTextBox":
                        {
                            var RichTextBox = FocusedControl as RichTextBox;
                            RichTextBox.Paste();
                            break;
                        }
                    case "TextBox":
                        {
                            var TextBox = FocusedControl as TextBox;
                            TextBox.Paste();
                            break;
                        }

                }
        }
    }