Domanda

Esiste un modo per modificare la dimensione della scheda predefinita in un RichTextBox .NET? Attualmente sembra essere impostato sull'equivalente di 8 spazi che è un po 'grande per i miei gusti.

Modifica: per chiarire, voglio impostare il valore predefinito globale di " \ t " viene visualizzato come 4 spazi per il controllo. Da quello che posso capire, la proprietà SelectionTabs richiede di selezionare prima tutto il testo e poi la larghezza della scheda tramite l'array. Lo farò se dovessi, ma preferirei cambiare il default globale una volta, se possibile, sottrarre che non devo farlo ogni volta.

È stato utile?

Soluzione

Puoi impostarlo impostando le SelectionTabs proprietà.

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

UPDATE:
La sequenza conta ....

Se si impostano le schede prima dell'inizializzazione del testo del controllo, non è necessario selezionare il testo prima di impostare le schede.

Ad esempio, nel codice sopra, questo manterrà il testo con le tabulazioni originali di 8 spazi:

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

Ma questo utilizzerà quelli nuovi:

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

Altri suggerimenti

Winforms non ha una proprietà per impostare la dimensione di scheda predefinita di un RichTexBox con un singolo numero, ma se sei pronto a scavare nel RTF della casella di testo RTF e modificarlo, c'è un'impostazione che puoi uso chiamato: " \ deftab " ;. Il numero successivo indica il numero di twip (1 punto = 1/72 di pollice = 20 twip). L'Rtf risultante con la dimensione standard della scheda di 720 twip potrebbe essere simile a:

{\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
}

Se devi convertire twips in pixel, usa questo codice ispirato a Converti pixel in punti :

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

Se si dispone di una casella RTF che viene utilizzata solo per visualizzare (sola lettura) testo a passo fisso, la cosa più semplice sarebbe non scherzare con le tabulazioni. Sostituiscile semplicemente con degli spazi.

Se vuoi che l'utente possa inserire qualcosa e usare quel tasto Tab per avanzare, puoi anche catturare il tasto Tab sovrascrivendo OnKeyDown () e stampando invece spazi.

È strano che nessuno abbia proposto questo metodo per tutto questo tempo)

Possiamo ereditare dal RichTextBox e riscrivere il gestore CmdKey ( ProcessCmdKey )
Apparirà così:

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

Ora, quando premi Tab , un determinato numero di spazi verrà inserito nell'area di controllo invece di \t

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top