Pregunta

¿Hay alguna forma de cambiar el tamaño de pestaña predeterminado en un .NET RichTextBox? Actualmente parece estar configurado en el equivalente a 8 espacios, lo cual es bastante grande para mi gusto.

Editar: para aclarar, quiero configurar el valor predeterminado global de " \ t " Muestra como 4 espacios para el control. Por lo que puedo entender, la propiedad SelectionTabs requiere que seleccione todo el texto primero y luego los anchos de las pestañas a través de la matriz. Haré esto si tengo que hacerlo, pero preferiría cambiar el valor predeterminado global una vez, si es posible, para no tener que hacerlo cada vez.

¿Fue útil?

Solución

Puede configurarlo configurando SelectionTabs propiedad.

private void Form1_Load(object sender, EventArgs e)
{
    richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
}

ACTUALIZACIÓN:
La secuencia importa ....

Si configura las pestañas antes de que se inicialice el texto del control, entonces no tiene que seleccionar el texto antes de configurar las pestañas.

Por ejemplo, en el código anterior, esto mantendrá el texto con las tabulaciones originales de 8 espacios:

richTextBox1.Text = "\t1\t2\t3\t4";
richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };

Pero esto usará los nuevos:

richTextBox1.SelectionTabs = new int[] { 100, 200, 300, 400 };
richTextBox1.Text = "\t1\t2\t3\t4";

Otros consejos

Winforms no tiene una propiedad para establecer el tamaño de pestaña predeterminado de un RichTexBox con un solo número, pero si está preparado para profundizar en el Rtf del cuadro de texto enriquecido, y modificarlo, hay una configuración que puede uso llamado: " \ deftab " ;. El número que sigue indica el número de twips (1 punto = 1/72 pulgada = 20 twips). El Rtf resultante con el tamaño de pestaña estándar de 720 twips podría tener un aspecto similar al siguiente:

{\rtf1\ansi\ansicpg1252\deff0\deflang2057\deftab720{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs41
1\tab 2\tab 3\tab 4\tab 5\par
}

Si necesita convertir twips en píxeles, use este código inspirado en Convertir píxeles en puntos :

int tabSize=720;
Graphics g = this.CreateGraphics();
int pixels = (int)Math.Round(((double)tabSize) / 1440.0 * g.DpiX);
g.Dispose();

Si tiene un cuadro RTF que solo se usa para mostrar (solo lectura) texto de tono fijo, lo más fácil sería no meterse con las paradas de tabulación. Simplemente reemplázalas con espacios.

Si desea que el usuario pueda ingresar algo y usar esa tecla Tab para avanzar, también puede capturar la tecla Tab al anular OnKeyDown () e imprimir espacios en su lugar.

Es extraño que nadie haya propuesto este método durante todo este tiempo)

Podemos heredar de RichTextBox y volver a escribir el controlador CmdKey ( ProcessCmdKey )
Se verá así:

public class TabRichTextBox : RichTextBox
{
    [Browsable(true), Category("Settings")]
    public int TabSize { get; set; } = 4;

    protected override bool ProcessCmdKey(ref Message Msg, Keys KeyData)
    {

        const int WM_KEYDOWN = 0x100;       // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-keydown
        const int WM_SYSKEYDOWN = 0x104;    // https://docs.microsoft.com/en-us/windows/desktop/inputdev/wm-syskeydown
        // Tab has been pressed
        if ((Msg.Msg == WM_KEYDOWN || Msg.Msg == WM_SYSKEYDOWN) && KeyData.HasFlag(Keys.Tab))
        {
            // Let's create a string of spaces, which length == TabSize
            // And then assign it to the current position
            SelectedText += new string(' ', TabSize);

            // Tab processed
            return true;
        }
        return base.ProcessCmdKey(ref Msg, KeyData);
    }
}

Ahora, cuando presione Tabulación , se insertará un número específico de espacios en el área de control en lugar de \t

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top