首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinForms:在鼠标初始悬停后,ToolTips不会(重新)出现

WinForms:在鼠标初始悬停后,ToolTips不会(重新)出现
EN

Stack Overflow用户
提问于 2014-09-19 13:30:30
回答 1查看 1.5K关注 0票数 1

我正在编写一个表单,它使用SharpMap MapBox将对象显示为世界地图上的点。当前,如果我输入带有光标的MapBox (mapBox1)并在点上停止,它将按我所希望的方式显示工具提示。但是,一旦我在MapBox中停止鼠标(不一定在点上)并在MapBox中移动鼠标,移动到这个点将不会(重新)显示工具提示。但是,如果我离开了MapBox (例如,将光标移出窗口或移动到一个菜单条上,或者移动到地图上的一个按钮上),我就可以得到工具提示,但只有一次才能像以前一样移动光标。

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

我尝试使用ToolTip.Hide(),ToolTip.Active = false (然后当我希望它显示时再次将其设置为true ),并在不同的点刷新MapBox。

相关守则:

ToolTip是全局的,构造函数将它定义为:

代码语言:javascript
复制
toolTip.InitialDelay = 1000;
toolTip.ReshowDelay = 750;
toolTip.ShowAlways = true;

然后,我为鼠标设置了两个事件处理程序,它们都绑定到MapBox上。"obj“是包含纬度和经度点的自定义类的全局对象。

代码语言:javascript
复制
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):

代码语言:javascript
复制
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;
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-23 12:47:31

试试这个(伪代码):

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25935179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档