Abilita copia, taglia, passa la finestra in una casella di testo RTF

Ho una ricca casella di testo ( richTextBox1 ) nel mio programma come mostrato di seguito. Ma quando clicco con il tasto destro, non appare una finestra “copia, taglia, passa”. Puoi dirmi come posso abilitare questa finestra “copia, taglia, incolla” nella mia casella Rich Text? Sono nuovo di C #, per favore fammi sapere passo dopo passo, se sai come risolvere questo

inserisci la descrizione dell'immagine qui

Prova con questo codice

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(); } } 

se si desidera copiare incolla con un’altra applicazione come Blocco note (without styles ) , sostituire i seguenti metodi

  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(); } } 

Se hai più di un RichTextBox , puoi utilizzare questo metodo di estensione :

  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; } } 

E richTextBox1.AddContextMenu(); questo modo: richTextBox1.AddContextMenu();

Un RichTextBox standard non contiene un menu di scelta rapida per tagliare, copiare e incollare. Tuttavia, puoi guardare questo articolo che ha il codice completo necessario per implementare il tuo!

Penso che la soluzione fornita da Thilina H sia eccellente, tranne alcuni bug.

  1. L’ evento MouseUp fa sì che il clic destro inizi dopo il secondo clic. Consiglio di utilizzare l’evento MouseDown anziché l’evento MouseUp .

  2. Ho provato in secondo luogo fornito il metodo CopyAction . Nel mio caso il metodo CopyAction non copiava i caratteri di inserimento. Ho dovuto modificare il codice in questo modo:

     Clipboard.SetText(richTextBox1.SelectedText.Replace("\n", "\r\n")); 
  3. Quando richTextBox1.SelectedText è vuoto, il programma ha mostrato un’eccezione. Ho semplicemente modificato il metodo CopyAction mostrato di seguito per risolvere il problema.

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

Felice codifica!

Voglio solo aggiungere alla risposta di Thilina H (quella che è stata contrassegnata come risposta corretta dal poster) Ecco le mie funzioni di copia e incolla, Sono un po ‘più come un blocco note.

 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; } } 

Spero che aiuti qualcuno ;

Grazie a @Jaex

https://stackoverflow.com/a/36624233/5132252

https://stackoverflow.com/a/435510/5132252

  [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; } } } } 

Nel caso in cui sia necessario aggiungere un menu di scelta rapida standard a più istanze di RichTextBox, potrebbe essere preferibile creare un componente esteso personalizzato ereditato da RichTextBox. È ansible aggiungere un nuovo componente dal menu di scelta rapida del progetto Solution Explorer Aggiungi -> Nuovo elemento … -> Controllo personalizzato.

È inoltre ansible definire il gestore per l’apertura del menu di scelta rapida per verificare se è selezionato un testo o gli appunti non sono vuoti.

Inoltre di solito ci sono altre azioni standard come Elimina il testo selezionato o Seleziona tutto il testo.

 namespace Common { public partial class RichTextBoxEx : RichTextBox { public RichTextBoxEx() { AddContextMenu(); } public void AddContextMenu() { ContextMenuStrip cms = new ContextMenuStrip { ShowImageMargin = false }; ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut"); tsmiCut.Click += (sender, e) => Cut(); cms.Items.Add(tsmiCut); ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy"); tsmiCopy.Click += (sender, e) => Copy(); cms.Items.Add(tsmiCopy); ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste"); tsmiPaste.Click += (sender, e) => Paste(); 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; }; cms.Items.Add(tsmiSelectAll); cms.Opening += delegate (object sender, CancelEventArgs e) { tsmiCut.Enabled = SelectionLength != 0; tsmiCopy.Enabled = SelectionLength != 0; tsmiPaste.Enabled = Clipboard.ContainsText(); tsmiDelete.Enabled = SelectionLength != 0; }; ContextMenuStrip = cms; } } }