我正在用 C# 编写一个 Windows 窗体应用程序,并创建一个 RichTextBox(通过代码,而不是设计器)。我将 AutoWordSelection 属性设置为 false,但是当我突出显示框中的内容时,它仍然跳到单词的边界,加上一个空格。这是 .NET 中的缺陷还是我做错了?
使用.NET 3.5我仍然遇到这个问题。这已于 2005 年向 Microsoft 报告并标记为“无法修复”。这是我能找到的有关该问题的最新消息。
以下是 MS Connect 错误报告: http://connect.microsoft.com/VisualStudio/feedback/details/115441/richtextboxs-autowordselection-property-does-not-work- Correctly#details
以下是 2010 年关于另一个注意到该问题的人的最新帖子: http://sonicflare.net/2010/01/10/shipped-bug-feature/#more-192
----------更新-------------
我通过在表单的 Load 事件中放置额外的 AutoWordSelection = False 来使其工作。
public Form1()
{
InitializeComponent();
rich = new RichTextBox();
rich.Size = new Size(150, 50);
rich.Text = "Ignoring a bug for five years does not make it a undocumented feature.";
rich.Location = new Point(20, 20);
rich.AutoWordSelection = false;
this.Controls.Add(rich);
}
private void Form1_Load(object sender, EventArgs e)
{
this.BeginInvoke(new EventHandler(delegate
{
rich.AutoWordSelection = false;
}));
}
TabControl 中的 RichTextBox 也存在同样的问题。它是在 Designer 中创建还是动态创建并不重要。正如 Roast 在他的答案下面的评论中建议的那样,解决方案是使用选项卡事件之一。将
AutoWordSelection
设置为 False
后,更改选项卡时问题会间歇性地出现。解决这个问题的方法是将其设置为 True
,然后在选项卡事件中设置为 False
。
Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
RichTextBox1.AutoWordSelection = True
RichTextBox1.AutoWordSelection = False
End Sub
我也在动态创建富文本框并遇到相同的选择问题。这需要一些努力,但我基本上通过自己的选择例程来解决这个问题。每当我的例程与控件的默认选择不一致时,就会出现一些明显的闪烁,但这还不错。
我创建了一个私有整数来跟踪选择的起始位置。默认为-1。然后我实现了一个 MouseDown 事件处理程序来处理鼠标左键的按下。它发现鼠标指针处的字符位置,如果它不在当前选择范围内,它将私有整数设置为当前字符位置。
然后,MouseMove 事件处理程序检查鼠标左键是否仍被按下,并根据保存的起始位置和当前字符位置更新控件的 SelectionStart 和 SelectionLength 属性。请注意,起始位置始终是所选内容的左侧,因此向后选择文本时它会跟随鼠标。如果您还想支持拖放和选择边距,那么它只会变得有点棘手。
AutoWordSelection
属性设置为
False
来实现解决方法。像这样:
Private Sub CreateNewRTBObject(ByVal items() As String)
Try
For Each s As String In items
If Not FilePaths.Contains(s) Then
rtb = New myRTB(s)
rtb.AutoWordSelection = False
End If
Next
tabs.SetTabWidth()
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Exclamation, title)
End Try
End Sub
VbNet 示例:
Private Sub SimpleRTB_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) 处理 Me.SelectionChanged ' ' ------------------------------------------------- -------------------- 自动选词错误修正 Me.AutoWordSelection = True Me.AutoWordSelection = False ' ------------------------------------------------- -------------------- 结束子