C# .NET Framework 4.8 RichTextBox末尾空白字符滚动失效问题求解
解决方案
RichTextBox 控件默认不会将行尾尾随的空白字符纳入内容宽度的计算范围,因此横向滚动条的最大滚动距离只到最后一个可见字符的位置,就会出现无法滚动到空白区域的问题。以下是两种可行的解决方法:
方案1:通过Win32 API修改排版规则(推荐)
该方案无需修改原始文本,从控件底层开启尾随空白的宽度计算,效果最接近记事本的表现。
- 首先在窗体类中引入Win32 API声明和相关常量:
using System.Runtime.InteropServices; public partial class Visualization : Form { private const int EM_SETTYPOGRAPHYOPTIONS = 0x04CA; private const int TO_ADVANCEDTYPOGRAPHY = 0x0001; private const int TO_DISABLECUSTOMTEXTOUT = 0x0002; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); // 你的其他原有代码 }
- 在窗体构造函数的
InitializeComponent()之后调用一次消息发送即可:
public Visualization(mFile file, string title) { InitializeComponent(); // 新增这一行配置排版规则 SendMessage(RichTextBoxVisualization.Handle, EM_SETTYPOGRAPHYOPTIONS, (IntPtr)(TO_ADVANCEDTYPOGRAPHY | TO_DISABLECUSTOMTEXTOUT), (IntPtr)(TO_ADVANCEDTYPOGRAPHY | TO_DISABLECUSTOMTEXTOUT)); try { labelTitle.Text = $"{title} | {file.fileName}"; RichTextBoxVisualization.Text = File.ReadAllText(file.myPathFile); } catch (Exception ex) { MessageBox.Show($"Error on read : {ex.Message}", "Erro!"); Close(); } }
方案2:纯托管代码手动设置右边距
如果不想调用系统API,可以通过手动计算最长行的宽度设置控件的RightMargin属性,直接扩展滚动范围:
public Visualization(mFile file, string title) { InitializeComponent(); try { labelTitle.Text = $"{title} | {file.fileName}"; RichTextBoxVisualization.Text = File.ReadAllText(file.myPathFile); // 新增以下代码计算并设置右边距 using (Graphics g = RichTextBoxVisualization.CreateGraphics()) { float maxLineWidth = 0; foreach (string line in RichTextBoxVisualization.Lines) { SizeF lineSize = g.MeasureString(line, RichTextBoxVisualization.Font); if (lineSize.Width > maxLineWidth) { maxLineWidth = lineSize.Width; } } // 增加10像素冗余避免内容贴边 RichTextBoxVisualization.RightMargin = (int)maxLineWidth + 10; } } catch (Exception ex) { MessageBox.Show($"Error on read : {ex.Message}", "Erro!"); Close(); } }
注意事项
- 请确保
RichTextBoxVisualization.WordWrap属性保持为false - 若后续有动态修改文本的需求,可在每次修改文本后重新执行一次方案1的消息发送或者方案2的边距计算逻辑
内容的提问来源于stack exchange,提问作者Leonardo urbano
相关产品推荐
相关产品推荐

