Изменение размера вкладки по умолчанию в RichTextBox - PullRequest
15 голосов
/ 30 сентября 2008

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

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

Ответы [ 4 ]

18 голосов
/ 30 сентября 2008

Вы можете установить его, установив свойство SelectionTabs .

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

UPDATE:
Последовательность имеет значение ....

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

Например, в приведенном выше коде текст будет сохранен с исходными 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";
2 голосов
/ 09 января 2012

У Winforms нет свойства для установки размера вкладки по умолчанию для RichTexBox с одним числом, но если вы готовы покопаться в Rtf расширенного текстового поля и изменить его, есть настройка, которую вы можете использовать под названием: "\ deftab". Число после этого указывает количество твипов (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();
1 голос
/ 01 сентября 2018

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

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

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

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

1 голос
/ 23 августа 2013

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

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

...