有没有办法更改.NET RichTextBox中的默认选项卡大小? 它目前似乎被设置为相当于8个空间,这对我来说有点大。
编辑:为了澄清,我想将全局默认值“\ t”显示为控件的4个空格。根据我的理解,SelectionTabs属性要求您先选择所有文本,然后通过数组选择选项卡宽度。如果必须,我会这样做,但我宁愿只更改一次全局默认值,如果可能的话,我不必每次都这样做。
答案 0 :(得分:18)
您可以通过设置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";
答案 1 :(得分:2)
Winforms没有使用单个数字设置RichTexBox的默认选项卡大小的属性,但如果您准备深入研究富文本框的Rtf并修改它,那么您可以设置一个设置使用称为:“\ deftab”。之后的数字表示缇数(1点= 1/72英寸= 20缇)。标准制表符大小为720缇的结果Rtf可能类似于:
{\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
}
如果您需要将缇转换为像素,请使用受Convert Pixels to Points启发的代码:
int tabSize=720;
Graphics g = this.CreateGraphics();
int pixels = (int)Math.Round(((double)tabSize) / 1440.0 * g.DpiX);
g.Dispose();
答案 2 :(得分:1)
如果你有一个仅用于显示(只读)固定音高文本的RTF框,最简单的方法就是不要乱用Tab停止。只需用空格替换它们。
如果您希望用户可以输入内容并使用该Tab键前进,您还可以通过覆盖OnKeyDown()
并打印空格来捕获Tab键。
答案 3 :(得分:1)
奇怪的是,一直没有人提出这种方法)
我们可以从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
答案 4 :(得分:0)
我正在使用带有等宽字体的此类;它将所有TAB替换为空格。
您要做的就是根据您的要求设置以下设计器属性:
代码
using System.ComponentModel;
using System.Windows.Forms;
namespace MyNamespace
{
public partial class MyRichTextBox : RichTextBox
{
public MyRichTextBox() : base() =>
KeyDown += new KeyEventHandler(RichTextBox_KeyDown);
[Browsable(true), Category("Settings"), Description("Convert all tabs into spaces."), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public bool ConvertTabToSpaces { get; set; } = false;
[Browsable(true), Category("Settings"), Description("The number os spaces used for replacing a tab character."), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public int TabSize { get; set; } = 4;
[Browsable(true), Category("Settings"), Description("The text associated with the control."), Bindable(true), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public new string Text
{
get => base.Text;
set => base.Text = ConvertTabToSpaces ? value.Replace("\t", new string(' ', TabSize)) : value;
}
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
if (ConvertTabToSpaces && KeyData == Keys.Tab && (Msg.Msg == WM_KEYDOWN || Msg.Msg == WM_SYSKEYDOWN))
{
SelectedText += new string(' ', TabSize);
return true;
}
return base.ProcessCmdKey(ref Msg, KeyData);
}
public new void AppendText(string text)
{
if (ConvertTabToSpaces)
text = text.Replace("\t", new string(' ', TabSize));
base.AppendText(text);
}
private void RichTextBox_KeyDown(object sender, KeyEventArgs e)
{
if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V))
{
SuspendLayout();
int start = SelectionStart;
string end = Text.Substring(start);
Text = Text.Substring(0, start);
Text += (string)Clipboard.GetData("Text") + end;
SelectionStart = TextLength - end.Length;
ResumeLayout();
e.Handled = true;
}
}
} // class
} // namespace