我创建了一个自定义UserControl,它在ToolStripDropDown中显示自己以模拟ToolTip功能 . 当我订阅他们的MouseEnter和MouseLeave事件时,它几乎适用于任何Control .
我也想将它用于自定义对象(而不是控件) . 我创建了一个定义MouseEnter和MouseLeave事件的接口,以便我可以将任何对象(例如自定义绘制的基元)订阅到此工具提示 . 这些类自己完成工作以确定何时触发MouseEnter和MouseLeave .
我的问题是,当显示工具提示时,包含自定义对象的UserControls不会收到MouseMove事件,即使工具提示显示在侧面而不是鼠标下方 . 我正在生成我自己的MouseLeave事件,如果鼠标不再位于相关对象上,则基于检查MouseMove . 但显然没有MouseMove事件,MouseLeave永远不会触发 .
当我在Control上显示工具提示时,除了MouseLeave仍然触发之外,同样的事情发生(没有MouseMove事件) .
1)如何模拟MouseLeave功能?我是否必须使用p / invoke进行SetCapture鼠标移动,或者有人知道更简单的方法吗?
2)当工具提示显示时,即使其中的ToolStripDropDown或我的UserControl都没有触发“GotFocus”事件,只要显示工具提示,我仍然会失去键盘焦点,这也是不理想的工具提示行为 . 我可以避免吗?
基本上我希望它是一个完全不可聚焦,无干扰的工具提示 . 我查看了一个名为SuperTooltip的示例项目,但它具有相同的缺陷功能 . 我已经尝试将ControlStyles.Selectable设置为false并且没有注意到任何更改 .
这是我创建工具提示UserControl的代码:
public CustomTooltip()
{
this.SetStyle(ControlStyles.Selectable, false);
dropDown = new ToolStripDropDown();
dropDown.AutoSize = false;
dropDown.Margin = Padding.Empty;
dropDown.Padding = Padding.Empty;
host = new ToolStripControlHost(this);
host.AutoSize = false;
host.Margin = Padding.Empty;
host.Padding = Padding.Empty;
this.Location = new Point(0, 0);
dropDown.Items.Add(host);
}
我用它来表明:
dropDown.Show(
new Point(Cursor.Position.X, Cursor.Position.Y + Cursor.Current.Size.Height),
ToolStripDropDownDirection.BelowRight
);
1 回答
我发现我能够通过从Form派生而不是使用ToolStripDropDown来实现这一目标 . 此类模拟工具提示的功能,并允许自定义淡入/淡出参数 . 您可以订阅控件或任何为MouseEnter和MouseLeave定义和实现ITooltipTarget的类 .
要使用上述类,您只需从CustomTooltip派生自己的自定义绘制工具提示 . 派生类将使用Tag属性来确定显示的内容 . 例如,如果我想要一个将Image与一个对象相关联并绘制该图像的工具提示,我会做类似的事情:
要在您的应用程序中使用此CustomImageTooltip类,您只需订阅和取消订阅该类的单个实例: