【问题标题】:How to increase AutoPopDelay value for ListViewItems in WinForms?如何增加 WinForms 中 ListViewItems 的 AutoPopDelay 值?
【发布时间】:2011-02-04 15:28:16
【问题描述】:

您知道ListView 中的每个项目都有一个ToolTipText 属性,仅此而已!没有像AutoPopDelay 这样的属性来设置它的显示时间......始终是默认值,5000 毫秒。我尝试将ToolTip 关联到每个项目,但这似乎是不可能的。

有没有办法增加ListViewItemToolTipText 属性的显示时间?

【问题讨论】:

  • 使用 one ToolTip 来处理 all 项的工具提示。 MouseHover 事件和 ListView.GetItemAt() 是必不可少的。
  • 可以增加显示时间。您可以使用LVM_GETTOOLTIPS 获取ListView 的ToolTip,然后向工具提示发送TTM_SETDELAYTIME 消息,并通过将TTDT_AUTOPOP 作为wparam 并将延迟以毫秒为单位作为lparam 来设置其延迟。

标签: c# .net winforms listview tooltip


【解决方案1】:

MouseHover 每个控件触发一次 - 因此当您移动到不同的项目时永远不会更新。

使用 ListView.ItemMouseHover 完成您需要的工作。

void listView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
{
    this.toolTip1.SetToolTip(e.Item.ListView, e.Item.ToolTipText);
}

【讨论】:

  • 这适用于显示的第一个工具提示,但不会显示其他工具提示。是什么阻止它在每次鼠标悬停时显示?
【解决方案2】:

您可以使用LVM_GETTOOLTIPS 获取ListViewToolTip,然后将TTM_SETDELAYTIME 消息发送到工具提示,并通过将TTDT_AUTOPOP 作为wparam 并将延迟以毫秒为单位作为lparam 来设置其延迟。

还要确保ListViewShowItemsToolTip 属性已设置为true,并且项目具有工具提示。

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
const int LVM_GETTOOLTIPS = 0x104E;
const int TTM_SETDELAYTIME = 0x403;
const int TTDT_AUTOPOP = 2;

private void button1_Click(object sender, EventArgs e)
{
    var tooltip = SendMessage(listView1.Handle, LVM_GETTOOLTIPS, 0, 0);
    SendMessage(tooltip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 10000 /*milliseconds*/);
}

要设置初始延迟或重新显示延迟,请为 wparam 设置以下值:

const int TTDT_AUTOMATIC = 0;
const int TTDT_AUTOPOP = 2;
const int TTDT_INITIAL = 3;

【讨论】:

    【解决方案3】:

    致汉斯·帕桑特。

    我在 MouseHover 事件中使用了这段代码:

        Point pntOnList = lsvSource.PointToClient
            (new Point(Cursor.Position.X, Cursor.Position.Y));
        ListViewItem lsviUnderMouse =
            lsvSource.GetItemAt(pntOnList.X, pntOnList.Y);
        if (lsviUnderMouse != null)
        {
            ttipDetails.SetToolTip(lsvSource, lsviUnderMouse.ToolTipText);
            ttipDetails.Active = true;
        }
        else
        {
            ttipDetails.Active = false;
        }
    

    但它的行为很奇怪。实际上 ToolTip 的文字总是过时的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2020-09-29
      • 2013-04-06
      相关资源
      最近更新 更多