Pergunta

Existe alguma maneira para alterar o tamanho de tabulação padrão em um .NET RichTextBox? Atualmente, parece ser definido para o equivalente a 8 espaços que é meio grande para o meu gosto.

Edit: Para esclarecer, eu quero definir o padrão global "\ t" é exibido como 4 espaços para o controle. Pelo que posso entender, a propriedade SelectionTabs requer que você selecione todo o texto primeiro e depois as larguras de guia através da matriz. Eu vou fazer isso se eu tiver que, mas eu preferia apenas alterar o padrão global de uma vez, se possível, sot que eu não tenho que fazer isso todas as vezes.

Foi útil?

Solução

Você pode configurá-lo, definindo o SelectionTabs propriedade .

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

UPDATE:
As matérias seqüência ....

Se você definir as abas antes de o texto do controle que está sendo inicializados, então você não tem que selecionar o texto antes de definir as guias.

Por exemplo, no código acima, isso irá manter o texto com a guia 8 espaços originais pára:

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

Mas isso vai usar os novos:

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

Outras dicas

WinForms não tem uma propriedade para definir o tamanho da guia padrão de um RichTexBox com um único número, mas se você está preparado para cavar a Rtf da caixa de texto rico, e modificar isso, não há uma configuração que você pode usar chamado: "\ deftab". O número depois indica o número de twips (1 ponto = 1/72 de polegada = 20 twips). A Rtf resultante com o tamanho da guia padrão de 720 twips poderia ser algo como:

{\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 você precisa converter twips em pixels, use este código inspirado a partir de Pixels converter para Pontos :

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

Se você tem uma caixa de RTF que só é usado para exibição (somente leitura) texto de passo fixo, a coisa mais fácil não seria mexer com tabulações. Simplesmente substituí-los encher com espaços.

Se você quiser que o usuário pode digitar algo e uso essa tecla Tab para avançar você também pode capturar a tecla Tab, substituindo espaços OnKeyDown() e imprimir vez.

É estranho que ninguém propôs este método por todo esse tempo)

Podemos herdar do RichTextBox e reescrever o manipulador CmdKey ( ProcessCmdKey )
Ele será parecido com este:

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

Agora, quando você pressionar Tab , um número especificado de espaços será inserido na área de controle em vez de \t

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top