Изменение размера вкладки по умолчанию в RichTextBox

StackOverflow https://stackoverflow.com/questions/154204

Вопрос

Есть ли способ изменить размер вкладки по умолчанию в .NET RichTextBox?В настоящее время кажется, что он равен 8 пробелам, что, на мой вкус, довольно много.

Редактировать:Чтобы уточнить, я хочу установить глобальное значение по умолчанию для отображения « » в виде 4 пробелов для элемента управления.Насколько я понимаю, свойство SelectionTabs требует, чтобы вы сначала выбрали весь текст, а затем ширину табуляции через массив.Я сделаю это, если понадобится, но я бы предпочел один раз изменить глобальное значение по умолчанию, если это возможно, чтобы мне не приходилось делать это каждый раз.

Это было полезно?

Решение

Вы можете установить его, установив Вкладки выбора свойство.

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

ОБНОВЛЯТЬ:
Последовательность имеет значение....

Если вы установили вкладки до инициализации текста элемента управления, вам не нужно выделять текст перед установкой вкладок.

Например, в приведенном выше коде текст сохранится с исходными позициями табуляции в 8 пробелов:

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

Но при этом будут использоваться новые:

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

Другие советы

Winforms не имеет свойства для установки размера табуляции RichTexBox по умолчанию с одним числом, но если вы готовы покопаться в Rtf поля форматированного текста и изменить его, вы можете использовать параметр под названием:"\дефтаб".Число после этого указывает количество твипов (1 балл = 1/72 дюйма = 20 твипов).Результирующий Rtf со стандартным размером табуляции 720 твипов может выглядеть примерно так:

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

Если вам нужно преобразовать твипы в пиксели, используйте этот код, вдохновленный Преобразование пикселей в точки:

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

Если у вас есть поле RTF, которое используется только для отображения (только для чтения) текста с фиксированным шагом, проще всего не возиться с позициями табуляции.Просто замените их пробелами.

Если вы хотите, чтобы пользователь мог что-то ввести и использовать эту клавишу Tab для продвижения, вы также можете захватить клавишу Tab, переопределив OnKeyDown() и вместо этого печатать пробелы.

Странно, что за все это время никто не предложил этот метод)

Мы можем наследовать от RichTextBox и перепишите обработчик CmdKey (Процесскмдкей)
Это будет выглядеть так:

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

Теперь, когда вы нажмете Вкладка, в область управления будет вставлено указанное количество пробелов вместо \t

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top