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