C# проверенный список MouseMove и обработчик событий MouseHover
-
20-09-2019 - |
Вопрос
Я использую следующее MouseMove
обработчик событий для отображения содержимого текстового файла в виде всплывающей подсказки в CheckedListBox, и для каждого CheckedListBoxItem имеется объект текстового файла, помеченный тегом.
private void checkedListBox1_MouseMove(object sender, MouseEventArgs e)
{
int itemIndex = checkedListBox1.IndexFromPoint(new Point(e.X, e.Y));
if (itemIndex >= 0)
{
if (checkedListBox1.Items[itemIndex] != null)
{
TextFile tf = (TextFile)checkedListBox1.Items[itemIndex];
string subString = tf.JavaCode.Substring(0, 350);
toolTip1.ToolTipTitle = tf.FileInfo.FullName;
toolTip1.SetToolTip(checkedListBox1, subString + "\n... ... ...");
}
}
}
Проблема в том, что мое приложение тормозит из-за частых движений мыши в CheckListBox.
Я подумал, что в качестве альтернативы мне следует использовать MouseHover
событие и его обработчик.Но мне не удалось узнать, на каком проверенномListBoxItem сейчас находится мой musePointer.Так:
private void checkedListBox1_MouseHover(object sender, EventArgs e)
{
if (sender != null)
{
CheckedListBox chk = (CheckedListBox)sender;
int index = chk.SelectedIndex;
if (chk != null)
{
TextFile tf = (TextFile)chk.SelectedItem;
string subString = tf.FileText.Substring(0, 350);
toolTip1.ToolTipTitle = tf.FileInfo.FullName;
toolTip1.SetToolTip(checkedListBox1, subString + "\n... ... ...");
}
}
}
Здесь int index
возвращает -1 и chk.SelectedItem
возвращается null
.
Каким может быть решение такого рода проблем?
Решение
В событии MouseHover вы можете использовать Свойство Cursor.Position и преобразовать его в позицию клиента и передать в IndexFromPoint(), чтобы определить, в каком элементе списка он содержится.
например.
Point ptCursor = Cursor.Position; ptCursor = PointToClient(ptCursor); int itemIndex=checkedTextBox1.IndexFromPoint(ptCursor); ... ...
Это полезно и для других событий, где в параметрах события не указано положение мыши.
Другие советы
Проблема в том, что SelectedItem <>checkItem, выбранный означает другой фон, проверенный означает наличие флажка с левой стороны.
вместо
int index = chk.SelectedIndex;
вы должны использовать:
int itemIndex = checkedListBox1.IndexFromPoint(new Point(e.X, e.Y));
bool selected = checkedListBox1.GetItemChecked(itemIndex );
затем покажите то, что вы хотите, если оно выбрано...