Как двойным кликом по слову в RichTextBox
выделить его и отобразить над ним Panel
(панель изначально скрыта и должна появляться когда происходит клик по слову)?
Как вариант можно повесить на 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;
}
Слово автоматически выделяется двойным кликом, так что ничего дополнительно делать не нужно.
Показать панель в нужном месте элементарно: координаты клика есть, просто устанавливаем их и вызываем 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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Суть вопроса в том что если xstock_quantity = 5, а reserved = 1, результат равен 3
Нужно запустить приложение Win forms из командной строки cmd и передать параметры на выполнение функции, графический интерфейс при этом не должен...