我尝试通过一个包含两个RichTextBox的拆分视图向自制编辑器添加行号。左边的是行号,右边的是实际文本。然而,我看到行号逐渐与文本不同步。我不确定通过截图测量是否准确,但尽管使用相同的字体,行编号文本框中字符之间的垂直间距为7像素,而主编辑器窗格中字符之间的垂直间距为6像素。实际字符本身在两个视图中具有相同的高度。
我使用以下代码设置所有内容
public class RTLSourceView : SplitContainer
{
public RTLSourceView(string filename)
{
DoubleBuffered = true;
Dock = DockStyle.Fill;
RtlRichTextBox rtb = new RtlRichTextBox();
rtb.Text = System.IO.File.ReadAllText(filename);
rtb.Dock = DockStyle.Fill;
rtb.ForeColor = Color.White;
rtb.BackColor = Color.Black;
rtb.Dock = DockStyle.Fill;
rtb.VScroll += richTextBox1_VScroll;
Panel2.Controls.Add(rtb);
RichTextBox line_numbers = new RichTextBox();
line_numbers.Multiline = true;
line_numbers.Dock = DockStyle.Fill;
line_numbers.WordWrap = false;
line_numbers.ReadOnly = true;
line_numbers.ForeColor = Color.White;
line_numbers.BackColor = Color.Black;
line_numbers.SelectionLength = 0;
line_numbers.SizeChanged += onSizeChange;
line_numbers.Font = rtb.Font;
line_numbers.ScrollBars = RichTextBoxScrollBars.None;
Panel1.Controls.Add(line_numbers);
我将line_numbers.Font设置为rtb.Font,这在调试器中看起来确实没问题。我更像是SystemVerilog程序员而不是C#程序员,所以我可能遗漏了一些其他人都知道的明显设置,但我很好奇是什么原因使附加到同一拆分面板的具有相同字体的两个RichTextBox具有两个不同的字体间距
2条答案
按热度按时间r7s23pms1#
这可能会有点棘手,因为不仅仅是字体的问题,例如,行间距会起作用,因为rtf中的每个CR都将是一个新的
/par
。下面是计算字符位置并在Y坐标改变时生成新行标签的方案的第一遍。
bhmjp9jg2#
@IVSoftware有一个很好的答案,因为它考虑到每行的字体可能不同。
但是,如果整个文档的字体相同,则需要将事件分配给
rtb
的FontChange
事件,或者在对话框中设置字体时将字体分配给两个RTBox。您的RTBox似乎在
RTLSourceView(...)
方法的作用域之外不可用,因此要访问它,您需要知道控件在面板中的位置(或循环通过Controls
属性)。RtlRichTextBox
可以在初始化时实现某些默认字体,在您代码中,有一个RtlRichTextBox
用于rtb
,有一个标准的RichTextBox
用于line_numbers
。上面的代码只是一个表单,其中有一个按钮用于调用
FontDialog.ShowDialog()
和拆分面板。