c # делает ShowItemToolTips липким - PullRequest
2 голосов
/ 15 мая 2009

У меня есть ListView, где несколько элементов имеют больше текста, чем помещается в ширину столбца. ShowItemToolTips означает, что я могу навести курсор на столбец и увидеть полный текст, что здорово.

Однако для действительно длинных текстов он исчезает до того, как появляется время прочитать все, поэтому я бы хотел, чтобы он оставался дольше (или, возможно, до тех пор, пока не будет удален вручную, например, убрав мышь или щелкнув. Как сделать это?

Ответы [ 3 ]

7 голосов
/ 16 мая 2009

Вы, конечно, знаете, что под классом .NET ListView находится элемент управления списком Windows. Этот элемент управления просмотра списка использует элемент управления всплывающей подсказки 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 - это количество миллисекунд, в течение которого элемент управления должен оставаться видимым.

2 голосов
/ 06 ноября 2011

Существует чистый альтернативный код .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 устанавливает подсказку к свойству ToolTipText родительского ListViewItem.

    void  listView_MouseMove(object sender, MouseEventArgs e)
    {
        ListViewItem item = listView.GetItemAt(e.X, e.Y);
        ListViewHitTestInfo info = listView.HitTest(e.X, e.Y);

        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);
        }
    }
0 голосов
/ 15 мая 2009

Проверьте класс ToolTip. Метод AutoPopupDelay позволяет установить период времени, в течение которого всплывающая подсказка остается видимой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...