Modifica della dimensione della scheda predefinita in RichTextBox
-
03-07-2019 - |
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.
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