WinForms: всплывающие подсказки не будут (повторно) появляться после первоначального наведения мыши

Я работаю над формой, которая использует SharpMap MapBox для отображения объектов в виде точек на карте мира. В настоящее время, если я вхожу в MapBox (mapBox1) с курсором и останавливаюсь на точке, она отображает всплывающую подсказку так, как я хочу. Однако, как только я остановил мышь в MapBox (не обязательно в точке) и переместил мышь в MapBox, перемещение в точку не будет (повторно) отображать всплывающую подсказку. Однако, если я покину MapBox (скажем, переместив курсор из окна или на одну из полос меню или на кнопку, наложенную на карту), я смогу отобразить всплывающую подсказку, но только один раз, прежде чем мне придется переместите курсор как прежде.

Что является причиной такого поведения, и есть ли простой способ исправить это?

Я попытался использовать ToolTip.Hide(), ToolTip.Active = false (а затем снова установить его в значение true, когда я хочу, чтобы он отображался) и обновить MapBox в различных точках.

Соответствующий код:

ToolTip является глобальным, и конструктор определяет его следующим образом:

toolTip.InitialDelay = 1000;
toolTip.ReshowDelay = 750;
toolTip.ShowAlways = true;

Затем у меня есть два обработчика событий для мыши, оба связаны с MapBox. "obj" - это глобальный объект пользовательского класса, содержащий точки широты и долготы.

private void mapBox1_MouseHover(object sender, EventArgs e)
    {
        PointF pos = mapBox1.PointToClient(Cursor.Position);
        int screenToleranceX = 20, screenToleranceY = 20;
        PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
        PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
        GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
        PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
        if (posLow.X <= objPoint.X && objPoint.X <= posHigh.X && posLow.Y <= objPoint.Y && objPoint.Y <= posHigh.Y)
        {
            toolTip.Active = true;
            toolTip.Show(obj.Name, mapBox1, mapBox1.PointToClient(Cursor.Position));
        }
    }

    private void mapBox1_MouseMove(GeoAPI.Geometries.Coordinate worldPos, MouseEventArgs imagePos)
    {
        PointF pos = mapBox1.PointToClient(Cursor.Position);
        int screenToleranceX = 20, screenToleranceY = 20;
        PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
        PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
        GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
        PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
        if (toolTip.Active && (posLow.X > objPoint.X || objPoint.X > posHigh.X || posLow.Y > objPoint.Y || objPoint.Y > posHigh.Y))
        {
            toolTip.Active = false;
        }
    }

** РЕДАКТИРОВАТЬ **

В соответствии с принятым ответом, у меня есть следующий код в качестве решения с надеждой улучшить его по мере необходимости. Однако пока это работает (используя внешне объявленный bool, toolTipDisp, по умолчанию false):

private void mapBox1_MouseMove(GeoAPI.Geometries.Coordinate worldPos, MouseEventArgs imagePos)
    {
        PointF pos = mapBox1.PointToClient(Cursor.Position);
        int screenToleranceX = 20, screenToleranceY = 20;
        PointF posLow = new PointF(pos.X - screenToleranceX, pos.Y - screenToleranceY);
        PointF posHigh = new PointF(pos.X + screenToleranceX, pos.Y + screenToleranceY);
        GeoAPI.Geometries.Coordinate objLoc = new GeoAPI.Geometries.Coordinate(obj.longitude, obj.latitude);
        PointF objPoint = mapBox1.Map.WorldToImage(objLoc);
        if (posLow.X <= objPoint.X && objPoint.X <= posHigh.X && posLow.Y <= objPoint.Y && objPoint.Y <= posHigh.Y)
        {
            if (!toolTipDisp)
            {
                toolTip.Show(obj.Name, mapBox1, mapBox1.PointToClient(Cursor.Position));
                toolTipDisp = true;
            }
        }
        else
        {
            toolTip.Hide(mapBox1);
            toolTipDisp = false;
        }
    }

1 ответ

Решение

Попробуйте это (псевдокод):

private string _previous;

private void mapBox1_MouseMove(GeoAPI.Geometries.Coordinate worldPos, MouseEventArgs imagePos)
{
    var text = ...; // generate tooltip text based on the new position
    if(text != _previous)
    {
        _previous = text;
        tooltip.Show(text, mapBox1, mapBox1.PointToClient(imagePos.Location)); 
    }
}

private void mapBox1_MouseLeave(object sender, EventArgs e)
{
    toolTip.Hide(mapBox1);
}
Другие вопросы по тегам