C# WinForms:首次鼠标悬停后,工具提示将不会(重新)显示

C# WinForms:首次鼠标悬停后,工具提示将不会(重新)显示,c#,winforms,tooltip,sharpmap,C#,Winforms,Tooltip,Sharpmap,我正在开发一个表单,它使用SharpMap MapBox在世界地图上将对象显示为点。当前,如果我使用光标输入贴图框(mapBox1)并停止在该点上,它将按我所希望的方式显示工具提示。但是,一旦我在MapBox中停止鼠标(不一定在点上)并在MapBox中移动鼠标,移动到该点将不会(重新)显示工具提示。但是,如果我离开映射框(例如,将光标移出窗口或移动到其中一个菜单条上,或移动到覆盖在地图上的按钮上),我就可以显示工具提示,但在我必须像以前一样移动光标之前,只需显示一次 是什么导致了这种行为,有什么

我正在开发一个表单,它使用SharpMap MapBox在世界地图上将对象显示为点。当前,如果我使用光标输入贴图框(mapBox1)并停止在该点上,它将按我所希望的方式显示工具提示。但是,一旦我在MapBox中停止鼠标(不一定在点上)并在MapBox中移动鼠标,移动到该点将不会(重新)显示工具提示。但是,如果我离开映射框(例如,将光标移出窗口或移动到其中一个菜单条上,或移动到覆盖在地图上的按钮上),我就可以显示工具提示,但在我必须像以前一样移动光标之前,只需显示一次

是什么导致了这种行为,有什么简单的方法可以解决吗?

我尝试过使用ToolTip.Hide()、ToolTip.Active=false(然后在需要显示时再次将其设置为true)并在各个点刷新映射框

相关代码:

工具提示是全局的,构造函数将其定义如下:

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;
        }
    }
private void mapBox1\u鼠标悬停(对象发送方,事件参数e)
{
PointF pos=mapBox1.PointToClient(游标位置);
int屏幕公差X=20,屏幕公差Y=20;
PointF posLow=新的PointF(位置X-屏幕公差X,位置Y-屏幕公差Y);
点F位置高=新点F(位置X+屏幕公差X,位置Y+屏幕公差Y);
GeoAPI.Geometries.Coordinate objLoc=新的GeoAPI.Geometries.Coordinate(obj.经度,obj.纬度);
PointF objPoint=mapBox1.Map.WorldToImage(objLoc);
if(posLow.X posHigh.Y))
{
toolTip.Active=false;
}
}
**编辑**

根据公认的答案,我有以下代码作为解决方案,希望根据需要进一步完善它。但是,现在可以这样做(使用外部声明的bool,toolTipDisp,默认为false):

private void mapBox1\u MouseMove(GeoAPI.Geometries.Coordinate worldPos,MouseEventArgs imagePos)
{
PointF pos=mapBox1.PointToClient(游标位置);
int屏幕公差X=20,屏幕公差Y=20;
PointF posLow=新的PointF(位置X-屏幕公差X,位置Y-屏幕公差Y);
点F位置高=新点F(位置X+屏幕公差X,位置Y+屏幕公差Y);
GeoAPI.Geometries.Coordinate objLoc=新的GeoAPI.Geometries.Coordinate(obj.经度,obj.纬度);
PointF objPoint=mapBox1.Map.WorldToImage(objLoc);
如果(posLow.X尝试这个(伪代码):


你有没有浏览过代码..我打赌它不起作用,因为如果
toolTip.Active=false;
你有没有查看文档以查看事件触发的顺序可能总是.Active=false..如果你注释掉
toolTip.Active=false;
你得到预期的行为了吗vior..??哪个操作系统?我记得当我从XP切换到7时,工具提示出现了一些问题。最后我得到了类似的结果。设置工具提示将更新它,但只有在工具提示更改(或者它将闪烁)时才这样做@Sinatr:我正在运行Windows7,VisualStudio2013.NET4@DJKRAZE:每当我跨过它时,我看到每当光标停在正确的位置时,它都会像我期望的那样尝试显示工具提示。如果我不使用ToolTip.Active=false,或尝试隐藏工具提示,它会一直存在,直到我将焦点从表单containi移开禁用映射框,这甚至更不可取。一种可能是使工具提示在几秒钟后过期,但我更希望它继续存在,因为在将来,我可能会有多个点在附近,而几个点可能在附近。我不知道
MapBox
是如何实现的,但让我们假设它是单个控件。然后仅发生一次且不会再次发生(直到
MouseLeave
)。您最好只使用
MouseMove
来显示/重新显示工具提示。这是我之前告诉过您的:在
MouseMove
事件中,为工具提示生成文本。如果文本与原来不同,则显示工具提示(使用
tooltip.Show
方法),否则什么也不做。在
MouseLeave
hide工具提示中(使用
tooltip.hide
方法)。这很接近,但我无法使用MouseLeave事件。但是,这确实为我提出的解决方案提供了想法,因此我将其标记为答案,并将我的最终解决方案发布为编辑。仅使用MouseMove事件,并使用MouseHover事件(和其他)中以前的条件当鼠标进入点的边界框时,我可以显示工具提示。但是,这会导致工具提示闪烁。通过使用布尔变量,当工具提示显示时设置为true,当工具提示隐藏时设置为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;
        }
    }
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);
}