c#make ShowItemToolTips很粘

我有一个ListView,其中有几个项目的文本多于列宽度。 ShowItemToolTips意味着我可以将鼠标hover在列上并查看完整的文本。

但是,对于很长的文本,它会在有时间阅读所有内容之前消失,所以我想让它停留更长时间(或者可能直到手动解散,例如移开鼠标或点击。我该怎么办?

当然,您知道.NET ListView类下面是Windows列表视图控件。 此listview控件使用Windows工具提示控件来显示截断的字符串。

您可以通过LVM_GETTOOLTIPS消息获取此基础工具提示控件。

[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); public IntPtr GetTooltipControl(ListView lv) { const int LVM_GETTOOLTIPS = 0x1000 + 78; return SendMessage(lv.handle, LVM_GETTOOLTIPS, 0, 0); } 

获得工具提示控件的句柄后,您可以向其发送消息。

 public void SetTooltipDelay(ListView lv, int showTime) { const int TTM_SETDELAYTIME = 0x400 + 3; const int TTDT_AUTOPOP = 2; IntPtr tooltip = this.GetTooltipControl(lv); if (tooltip != IntPtr.Zero) { SendMessage(tooltip, TTM_SETDELAYTIME, TTDT_AUTOPOP, showTime); } } 

showTime是您希望控件保持可见的毫秒数。

有一个纯net代码替代user32.dll P / Invoke调用。 创建ToolTip控件并设置所有延迟属性。 然后使用ListView MouseMove事件根据当前选定的列表视图控件切换工具提示文本。

  ToolTip toolTip = new ToolTip(); toolTip.AutoPopDelay = 7000; toolTip.InitialDelay = 450; toolTip.ReshowDelay = 450; listView.MouseMove += new MouseEventHandler(listView_MouseMove); 

我在下面给出了两个选项。 选项#1将工具提示文本设置为子项的Text属性。 选项#2将工具提示设置为父ListViewItem的ToolTipText属性。

  void listView_MouseMove(object sender, MouseEventArgs e) { ListViewItem item = listView.GetItemAt(eX, eY); ListViewHitTestInfo info = listView.HitTest(eX, eY); if ((item != null) && (info.SubItem != null)) { // Option #1 - Set it to the sub-item text // toolTip.SetToolTip(listView, info.SubItem.Text); // Option #2 - Sets it to the tool tip text of the sub-item toolTip.SetToolTip(listView, info.Item.ToolTipText); } else { toolTip.SetToolTip(listView, null); } } 

查看ToolTip类。 AutoPopupDelay方法允许您设置工具提示保持可见的时间长度。