Cómo implementar un menú contextual para copiar, cortar y pegar sobre un cuadro de texto enriquecido en WinForms C#

Cómo implementar un menú contextual para copiar, cortar y pegar sobre un cuadro de texto enriquecido en WinForms C#

De forma predeterminada, los componentes de cuadros de texto enriquecido no ofrecen ninguna utilidad para realizar las interacciones más básicas del usuario con un editor de texto, lo que significa copiar, cortar, seleccionar todo o eliminar un fragmento de texto. Esto significa que deberá implementar esta función usted mismo. En este artículo, le explicaremos cómo agregar una franja de menú contextual a sus cuadros de texto enriquecido, para que el usuario pueda usar un menú contextual del editor de texto normal.

1. Crea la clase ExtensionMethods

Solo se especifica en el sitio web de MSDN, cuando alguna función debe implementarse en varios lugares de su proyecto, lo último que debe hacer es reescribir su utilidad en todo el proyecto. En cambio, según sea necesario en este caso, el RichtTextBoxtipo ya existe, por lo que podemos escribir una extensión sin crear un nuevo tipo derivado.

El siguiente ejemplo muestra cómo crear una clase de métodos de extensión que contendrá nuestro método auxiliar EnableContextMenu que debería ser invocable desde cualquier instancia de RichTextBox. Crea el  ExtensionMethods.csarchivo y registra la siguiente clase:

using System.Windows.Forms;

// Important ! Create the ExtensionMethods class as a "public static" class
public static class ExtensionMethods
{
    public static void EnableContextMenu(this RichTextBox rtb)
    {
        if (rtb.ContextMenuStrip == null)
        {
            // Crear un ContextMenuStrip sin iconos
            ContextMenuStrip cms = new ContextMenuStrip();
            cms.ShowImageMargin = false;

            // 1. Agregue la opción Deshacer
            ToolStripMenuItem tsmiUndo = new ToolStripMenuItem("Undo");
            tsmiUndo.Click += (sender, e) => rtb.Undo();
            cms.Items.Add(tsmiUndo);

            // 2. Agrega la opción Rehacer
            ToolStripMenuItem tsmiRedo = new ToolStripMenuItem("Redo");
            tsmiRedo.Click += (sender, e) => rtb.Redo();
            cms.Items.Add(tsmiRedo);

            // Agregar un separador
            cms.Items.Add(new ToolStripSeparator());

            // 3. Agregue la opción Cortar (corta el texto seleccionado dentro del cuadro de texto enriquecido)
            ToolStripMenuItem tsmiCut = new ToolStripMenuItem("Cut");
            tsmiCut.Click += (sender, e) => rtb.Cut();
            cms.Items.Add(tsmiCut);

            // 4. Agregue la opción Copiar (copia el texto seleccionado dentro del cuadro de texto enriquecido)
            ToolStripMenuItem tsmiCopy = new ToolStripMenuItem("Copy");
            tsmiCopy.Click += (sender, e) => rtb.Copy();
            cms.Items.Add(tsmiCopy);

            // 5. Agregue la opción Pegar (agrega el texto del portapapeles al cuadro de texto enriquecido)
            ToolStripMenuItem tsmiPaste = new ToolStripMenuItem("Paste");
            tsmiPaste.Click += (sender, e) => rtb.Paste();
            cms.Items.Add(tsmiPaste);

            // 6. Agregue la opción Eliminar (elimine el texto seleccionado en el cuadro de texto enriquecido)
            ToolStripMenuItem tsmiDelete = new ToolStripMenuItem("Delete");
            tsmiDelete.Click += (sender, e) => rtb.SelectedText = "";
            cms.Items.Add(tsmiDelete);

            // Agregar un separador
            cms.Items.Add(new ToolStripSeparator());

            // 7. Agregue la opción Seleccionar todo (selecciona todo el texto dentro del cuadro de texto enriquecido)
            ToolStripMenuItem tsmiSelectAll = new ToolStripMenuItem("Select All");
            tsmiSelectAll.Click += (sender, e) => rtb.SelectAll();
            cms.Items.Add(tsmiSelectAll);

            // Al abrir el menú, verifique si se cumple la condición
            // para habilitar la acción
            cms.Opening += (sender, e) =>
            {
                tsmiUndo.Enabled = !rtb.ReadOnly && rtb.CanUndo;
                tsmiRedo.Enabled = !rtb.ReadOnly && rtb.CanRedo;
                tsmiCut.Enabled = !rtb.ReadOnly && rtb.SelectionLength > 0;
                tsmiCopy.Enabled = rtb.SelectionLength > 0;
                tsmiPaste.Enabled = !rtb.ReadOnly && Clipboard.ContainsText();
                tsmiDelete.Enabled = !rtb.ReadOnly && rtb.SelectionLength > 0;
                tsmiSelectAll.Enabled = rtb.TextLength > 0 && rtb.SelectionLength < rtb.TextLength;
            };

            rtb.ContextMenuStrip = cms;
        }
    }
} 

El método mencionado, crea dinámicamente un ContextMenuStrip sobre el punto cliqueado (con clic derecho) dentro del RichTextBox, ofreciendo algunas opciones según su disponibilidad.

2. Habilite el menú contextual en RichTextBox

Como dijimos antes, es posible que tenga varios cuadros de texto enriquecido que necesiten la misma función. La extensión creada anteriormente permite específicamente llamar a un nuevo método desde una instancia del cuadro de texto enriquecido:

richTextBox1.EnableContextMenu();

En algunos casos, debido al contexto (donde crea la clase), es posible que deba traer la extensión al alcance llamando a la directiva:

using ExtensionMethods;

Entonces, por ejemplo, durante la inicialización de un formulario muy simple (dentro del constructor):

using System;
 
using System.Windows.Forms; 

namespace Sandbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // ¡Habilita el menú contextual!
            richTextBox1.EnableContextMenu();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Tal como se muestra en la captura de pantalla del artículo, cada vez que haga clic derecho en el cuadro de texto enriquecido, aparecerá el menú y se habilitarán todas las opciones si están disponibles.

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable