Подсказка для изображения и карты изображения

У меня есть PictureBox, которому назначена карта (в основном список Rectangle объектов). Теперь я хочу сделать это так, если пользователь наводит указатель мыши на это поле с изображением, и если мышь находится над прямоугольником, который существует в списке, всплывающая подсказка и показывает некоторую информацию.

Отображение работает нормально, но проблема в том, что ToolTip сходит с ума и не отображается должным образом, он просто продолжает появляться при любом движении мыши. Как я могу закодировать его так, чтобы он всплывал только тогда, когда мышь находится в прямоугольнике?

Это мой код, и там внизу вы видите пример!

private void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e)
{
    if (PackageMap == null || PackageMap.Count == 0) return;
    var point = new Point(e.X, e.Y);

    foreach (var map in PackageMap)
    {
        if (map.Rectangle.Contains(point))
        {
            var tip = new ToolTip();
            tip.ToolTipTitle = map.Pin.Group;
            tip.Show("Result: " + map.Pin.Mk2Result, pictureBoxPackageView, point, 200);
            break;
        }
    }
}

введите здесь описание изображения


person Saeid Yazdani    schedule 16.08.2012    source источник


Ответы (2)


Он постоянно появляется, потому что вы только проверяете, находится ли курсор внутри прямоугольника. Помните, что вы по-прежнему можете двигать мышью несколько раз, но при этом оставаться в пределах этого прямоугольника.

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

person jfs    schedule 16.08.2012

Я бы добавил собственный прослушиватель для обнаружения MouseEnter Событие и MouseLeave для каждого отдельного прямоугольного контейнера, для которого вы хотите отображать отдельную всплывающую подсказку, добавив код для отображения всплывающей подсказки в течение X секунд при нажатии MouseEnter (используйте Show() для отображения). Если пользователь удерживает курсор внутри прямоугольника, он будет отображаться в течение этих X секунд (используйте AutoPopDelay для автоматического скрытия по истечении этих X секунд). Если пользователь перемещает курсор наружу, событие MouseLeave должно использовать Скрыть().

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

Должно выглядеть примерно так (не показывает правильно установленные свойства):

private void area1_MouseEnter(object sender, EventArgs e)
{
    tooltip.Show("text to display", window);
}

private void area1_MouseLeave(object sender, EventArgs e)
{
    tooltip.Hide(window);
}

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

person CODe    schedule 16.08.2012