【问题标题】:RichTextBox.AutoWordSelection broken?RichTextBox.AutoWordSelection 坏了?
【发布时间】:2016-07-10 11:46:39
【问题描述】:

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

【问题讨论】:

  • “跳到单词的边界”到底是什么意思? AutoWordSelection = True 允许用户双击一个单词并选择它。如果这不起作用,请发布代码 sn-p 和更详细的描述。
  • 如果您将光标放在一个单词的中间并将其拖动到另一个单词的中间,它应该选择了两个单词的一半。不是这种情况。当您将其拖动到另一个单词时,它会选择整个单词以及单词右侧的空格,而不仅仅是您将鼠标拖过的字符。如果你想明白我的意思,只需制作一个richtextbox,输入它,然后尝试突出显示一组单词,你会看到它会“跳”到最近的单词的边缘,而不是完全停留在你的鼠标。

标签: c# .net richtextbox


【解决方案1】:

使用 .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。在这种情况下可以修复吗?
  • 也许尝试在其中一个选项卡事件中执行此操作。我相信关键是将属性设置在与创建它的线程不同的线程上。另请注意,虽然您的拖放选择适用于我的修复,但双击一个单词仍会选择它。
【解决方案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

【讨论】:

    【解决方案3】:

    我也在动态创建富文本框并且遇到了同样的选择问题。这需要做一些工作,但我基本上通过自己的选择程序来解决它。每当我的例程不同意控件的默认选择时,都会出现一些明显的闪烁,但这还不错。

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

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

    如果您还想支持拖放和选择边距,这只会有点棘手。

    【讨论】:

      【解决方案4】:

      我也遇到过这种情况,但使用的是带有多个 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
      

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 2017-12-14
        相关资源
        最近更新 更多