RichTextBox.AutoWordSelection坏了吗?

时间:2010-05-18 18:40:15

标签: c# .net richtextbox

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

4 个答案:

答案 0 :(得分:14)

使用.NET 3.5我仍然有这个问题。这是向微软报告并在2005年被标记为“不会修复”。这是我可以在这个问题上找到的最新消息。

以下是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

---------- UPDATE -------------

我通过在Form的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;
    }));
}

答案 1 :(得分: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

答案 2 :(得分:0)

我也在动态创建富文本框,并且具有相同的选择问题。这花了一些时间,但我通过基本上做自己的选择例程来解决它。每当我的例程不同意控件的默认选择时,都会有一些明显的闪烁,但这并不算太糟糕。

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

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

如果你想支持拖放和选择余量,那只会有点棘手。

答案 3 :(得分: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