Выделить слово в RichTextBox

278
02 июня 2017, 09:57

Как двойным кликом по слову в RichTextBox выделить его и отобразить над ним Panel (панель изначально скрыта и должна появляться когда происходит клик по слову)?

Answer 1

Как вариант можно повесить на RichTextBox событие SelectionChanged(), которое происходит после изменения выбора (выделения) текста в RichTextBox:

private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
    // Проверяем что длина выбранного текста больше нуля,
    // иначе panel1 станет видимой при вводе текста
    if (richTextBox1.SelectedText.Length > 0)
       panel1.Visible = true;
    else
       panel1.Visible = false;
}

Двойным кликом изменится выделение слова и как раз сработает событие richTextBox1_SelectionChanged

Update

Для установления позиции события нужно использовать MouseEventArgs. В моем методе EventHandler не сможет принять MouseEventArgs. Тогда нужно взять за основу метод @AlexanderPetrov. Единственно,

panel.Location = e.Location;

позиция panel будет считаться с левого верхнего угла формы, так как событие происходит в richTextBox, и за начало координат берется верхний левый угол именно richTextBox. То есть Вам нужно еще посчитать координаты Вашей panel:

Координата X будет равна:

e.Location.X + richTextBox1.Location.X - panel1.Width / 2

richTextBox1.Location.X - координата X левого верхнего угла richTextBox1;

e.Location.X - координата X в самом richTextBox1.

Из этой суммы вычитаем panel1.Width / 2, чтобы левый край panel не был над началом слова, а был смещен, т.о. что panel будет надвисать над словом.

Координата Y будет равна:

e.Location.Y + richTextBox1.Location.Y - panel1.Height - richTextBox1.Height

e.Location.Y + richTextBox1.Location.Y - то же самое, что в X. Из этой суммы вычитаем высоту panel1.Height и richTextBox1.Height, чтобы panel1 не перекрывала richTextBox1. Итого:

private void richTextBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{            
    int length = richTextBox1.SelectionLength;
    // проверяем длину выбранного текста, если что-то выбрано, 
    // то показываем panel1
    if (length > 0)
    {
        int startIndex = richTextBox1.SelectionStart;
        string word = richTextBox1.Text.Substring(startIndex, length).TrimEnd();
        int X = e.Location.X + richTextBox1.Location.X - panel1.Width / 2;
        int Y = e.Location.Y + richTextBox1.Location.Y - panel1.Height - richTextBox1.Height;
        panel1.Location = new Point(X, Y);
        panel1.Visible = true;
    }
}

Также оставляем событие:

private void richTextBox1_SelectionChanged(object sender, EventArgs e)
{
    // Если нет выбранного текста,
    // скрываем panel1
    if (richTextBox1.SelectionLength == 0)
        panel1.Visible = false;             
}
Answer 2

Слово автоматически выделяется двойным кликом, так что ничего дополнительно делать не нужно.

Показать панель в нужном месте элементарно: координаты клика есть, просто устанавливаем их и вызываем Show.

Дополнительно я написал, как получить выделенное слово.

private void RichTextBox_MouseDoubleClick(object sender, MouseEventArgs e)
{
    int startIndex = richTextBox.SelectionStart;
    int length = richTextBox.SelectionLength;
    string word = richTextBox.Text.Substring(startIndex, length).TrimEnd();
    panel.Location = e.Location;
    panel.Show();
}
READ ALSO
Помогите разобраться. С#

Помогите разобраться. С#

Суть вопроса в том что если xstock_quantity = 5, а reserved = 1, результат равен 3

213
Как вызвать функцию Win Forms приложения из console?

Как вызвать функцию Win Forms приложения из console?

Нужно запустить приложение Win forms из командной строки cmd и передать параметры на выполнение функции, графический интерфейс при этом не должен...

369
Можно ли узнать кто прячется за ServiceHost?

Можно ли узнать кто прячется за ServiceHost?

При работе с пакетом офиса через MicrosoftOffice

193
Замена контента формы c#

Замена контента формы c#

Всем привет!

225