RichTextBox.AutoWordSelection 损坏了?

问题描述 投票:0回答:5

我正在用 C# 编写一个 Windows 窗体应用程序,并创建一个 RichTextBox(通过代码,而不是设计器)。我将 AutoWordSelection 属性设置为 false,但是当我突出显示框中的内容时,它仍然跳到单词的边界,加上一个空格。这是 .NET 中的缺陷还是我做错了?

c# .net richtextbox
5个回答
16
投票

使用.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;
    }));
}

2
投票

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

0
投票

我也在动态创建富文本框并遇到相同的选择问题。这需要一些努力,但我基本上通过自己的选择例程来解决这个问题。每当我的例程与控件的默认选择不一致时,就会出现一些明显的闪烁,但这还不错。

我创建了一个私有整数来跟踪选择的起始位置。默认为-1。然后我实现了一个 MouseDown 事件处理程序来处理鼠标左键的按下。它发现鼠标指针处的字符位置,如果它不在当前选择范围内,它将私有整数设置为当前字符位置。

然后,MouseMove 事件处理程序检查鼠标左键是否仍被按下,并根据保存的起始位置和当前字符位置更新控件的 SelectionStart 和 SelectionLength 属性。请注意,起始位置始终是所选内容的左侧,因此向后选择文本时它会跟随鼠标。

如果您还想支持拖放和选择边距,那么它只会变得有点棘手。


0
投票
我也遇到过这种情况,但使用的是具有多个 RTB 的选项卡式编辑器。在这种情况下,您可以通过在创建 RichTextBox 的代码块中将

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
    

0
投票
解决方案是在SelectionChanged事件中将其设置为ON和OFF。

VbNet 示例:

Private Sub SimpleRTB_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) 处理 Me.SelectionChanged ' ' ------------------------------------------------- -------------------- 自动选词错误修正 Me.AutoWordSelection = True Me.AutoWordSelection = False ' ------------------------------------------------- -------------------- 结束子

© www.soinside.com 2019 - 2024. All rights reserved.