2010-05-18 2 views
5

Я пишу приложение форм Windows в C#, и я создаю RichTextBox (через код, а не дизайнер). Я устанавливаю для свойства AutoWordSelection значение false, но когда я выделяю материал в поле, он все же переходит к границам слов, плюс пробел. Это ошибка в .NET, или я делаю это неправильно?RichTextBox.AutoWordSelection сломан?

+0

Что именно вы подразумеваете под «прыжками до границ слов»? AutoWordSelection = True позволяет пользователю дважды щелкнуть слово и выбрать его. Если это не работает, отправьте фрагмент кода и более подробное описание того, что происходит. – Roast

+1

Если вы поместите курсор в середину слова и перетащите его в середину другого слова, у него должно быть половина обоих выбранных слов. Это не тот случай.Когда вы перетаскиваете его на другое слово, он выбирает все слово плюс пробел в правой части слова, а не только символы, которые вы нажимаете на мышь. Если вы хотите увидеть, что я имею в виду, просто создайте richtextbox, введите его и попробуйте выделить группу слов, и вы увидите, что он «прыгнет» на край ближайшего слова, а не останется точно с помощью мыши. – Nilbert

ответ

14

Использование .NET 3.5 У меня все еще есть эта проблема. Это было сообщено Microsoft и помечено как «Wont Fix» в 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 -------------

Я запустил его, добавив дополнительное значение AutoWordSelection = False в событии Load Form.

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; 
    })); 
} 
+0

Проблема заключается в том, что текстовые поля динамически создаются в программе. Если вы можете себе представить, каждый раз, когда пользователь добавляет вкладку TabControl, которая у меня есть в моей форме, вкладка оснащается RichTextBox. Можно ли это зафиксировать в этом случае? – Nilbert

+1

Возможно, попробуйте сделать это в одном из событий табуляции. Я считаю, что ключ должен был бы установить свойство в другом потоке, чем тот, на котором он создан. Также обратите внимание, в то время как ваш выбор перетаскивания работает на моем исправлении, двойной щелчок по слову все еще выбирает его. – Roast

0

Я также динамически создаю насыщенные текстовые поля и имел ту же проблему с выбором. Это заняло некоторое время, но я работал над этим, выполнив свою собственную процедуру отбора. Есть некоторые заметные мерцания всякий раз, когда моя рутина не согласна с выбором по умолчанию элемента управления, но это не так уж плохо.

Я создал частное целое число, которое отслеживает начальную позицию выбора. По умолчанию это -1. Затем я применил обработчик событий MouseDown для обработки нажатия левой кнопки мыши. Он обнаруживает позицию символа у указателя мыши, и если он еще не находится внутри текущего выделения, он устанавливает частное целое в текущую позицию символа.

Обработчик события MouseMove затем проверяет, что нажата левая кнопка мыши, и обновляет свойства SelectionStart и SelectionLength элемента управления в соответствии с сохраненной начальной позицией и текущей позицией символа. Обратите внимание, что начальная позиция всегда является левой стороной выбора, поэтому она следует за мышью при выборе текста назад.

Это немного сложно, если вы хотите также поддерживать перетаскивание и выделение.

0

Я также столкнулся с этим, но с помощью редактора с вкладками с несколькими RTB. В этом случае вы можете реализовать обходной путь, установив свойство AutoWordSelection в False в блок кода, который создает RichTextBox. Нравится так:

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 
1

Такая же проблема здесь с RichTextBox в TabControl. Не важно, было ли оно создано в Designer или динамически. Решение, как предложил Жост в комментарии ниже своего ответа, использовать одно из событий табуляции. После установки 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