4

我有一个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;
        }
    }
}

在此处输入图像描述

4

2 回答 2

3

它不断弹出,因为您只检查光标是否在矩形内。请记住,您仍然可以多次移动鼠标,但您仍然在该矩形内。

我认为您想要的是在输入矩形时仅弹出一次工具提示。您应该记住鼠标的先前位置。如果当前位置在一个矩形内,则检查前一个位置是否不在同一个矩形内。这是显示工具提示的时间,否则通过。

于 2012-08-16T09:28:17.393 回答
3

我将添加一个自定义侦听器来检测您希望显示不同工具提示的每个单独的矩形容器的MouseEnter事件和MouseLeave事件,添加代码以在 MouseEnter 上显示工具提示 X 秒(使用Show()方法显示) . 如果用户将光标保持在矩形内,它将继续显示 X 秒(使用AutoPopDelay属性在 X 秒后自动隐藏)。如果用户将光标移出,则 MouseLeave 事件应使用Hide()方法。

当您一次将光标移动到多个区域时,我还将设置一秒延迟以防止打开多个工具提示。为此使用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);
}

我要走的路线是扩展您正在使用的容器并将这些侦听器添加到自定义容器类中,特别是如果您正在创建几个都需要此功能的类似容器。

于 2012-08-16T10:13:36.780 回答