Могу ли я установить бесконечный AutoPopDelay для всплывающей подсказки в окне .NET Windows Forms? - PullRequest
7 голосов
/ 30 апреля 2009

У меня есть требование не иметь стандартную .NET Windows Forms подсказку, автоматически скрывающую подсказки - то есть мне нужно, чтобы они оставались видимыми до тех пор, пока мышь не сместится с элемента управления, имеющего подсказку. Я хотел бы избежать использования определенных событий MouseEnter и MouseLeave для всех элементов управления с всплывающей подсказкой. Я рад услышать о сторонних решениях, если они решат проблему.

Ответы [ 10 ]

12 голосов
/ 13 апреля 2012

Поскольку оно было опубликовано бесчисленное количество раз и известно из ранних версий .NET Framework, вы не можете установить время AutoPopDelay выше, чем Int16.MaxValue (т.е. 32767), и заставить его работать. Использование всплывающей подсказки метода Show () приводит к тому же результату. Любое значение выше 32767 приводит к сбросу таймера до 5000 мс.

Даже попытка установить для AutomaticDelay значение, которое приводит к значению AutoPopDelay, превышающему 32767, заставит всплывающую подсказку не работать. Кроме того, использование метода StopTimer () не дает никаких положительных результатов.

Единственный способ, которым мне удалось отобразить всплывающую подсказку с бесконечным таймаутом, - это использовать метод Show () всплывающей подсказки, который пропускает отображаемую позицию. tooltip.Show(text, control, position). В заключение, элемент управления всплывающей подсказки имеет наиболее странное поведение, с которым я когда-либо сталкивался в элементе управления, и документация по настройке времени задержки вводит в заблуждение.

11 голосов
/ 24 июня 2010

Я искал решение проблемы

  1. Всплывающее окно исчезает слишком быстро, не позволяя мне прочитать его содержимое
  2. Всплывающее окно больше не появляется при наведении курсора на этот регион.

Я нашел на форумах следующий ответ, который не решает проблему 2, но позволяет мне читать текст дольше, чем мне нужно, когда я устанавливаю его значение на 32766 и таким образом - в моем мнение - это своего рода «работа вокруг»:

На самом деле, я обнаружил, что моя проблема в том, что я присвоил значение выше 32767 (32768 и выше будут иметь эффект 5 секунд) на самом деле странно, поскольку AutoPopDelay должен принимать целое число (32 бита) как параметр, а 32767 действительно 16-разрядный со знаком ...

Но я должен признать, это все еще отстой ...

Но установка на 32000 (32 секунды), кажется, работает лучше. Понятия не имею, почему это так, но, возможно, это кому-то поможет.

2 голосов
/ 29 февраля 2012

В моем приложении текст всплывающей подсказки должен обновляться каждые 10 секунд. Что работает для меня, так это отключать и активировать всплывающую подсказку каждый раз, когда этот текст обновляется. Когда я установлю AutoPopDelay более чем на 10 секунд, всплывающая подсказка останется навсегда. Таким образом, вы можете использовать таймер для многократной активации и деактивации всплывающей подсказки:

private void timer1_Tick(object sender, EventArgs e)
{
    toolTip1.Active = false;
    toolTip1.Active = true;
}

Чтобы свести к минимуму мерцание, возникающее при повторной активации всплывающей подсказки, установите InitialDelay на 1. Если вы установите AutoPopDelay на 30000, а интервал таймера также на 30000, вы увидите очень короткое мерцание только один раз каждые 30 секунд. Для моего приложения это короткое мерцание приемлемо. Кстати, не забудьте включить таймер! (Сначала я думал, что это не работает, пока я не обнаружил, что забыл включить таймер; -))

Конечно, это лекарство от симптомов, а не элегантное решение проблемы.

2 голосов
/ 21 декабря 2009

Попробуйте myToolTip.ReshowDelay = 0.

Вы просто показываете всплывающую подсказку сразу после истечения ее задержки. У меня это сработало.

1 голос
/ 01 декабря 2011

Из моего ограниченного опыта я обнаружил, что установка свойства showAlways в значение true имеет побочный эффект, заключающийся в том, что подсказка отображается «бесконечно» (пока курсор не покинет элемент управления). Это не то, что в документации говорится, что это будет делать, но это то, что я испытал. (Однако я использую компонент Janus Supertip, и, возможно, это влияет на поведение).

1 голос
/ 04 октября 2010

Я думаю, что вы пытаетесь излечить симптомы, а не причину вашей проблемы.

Вы пытаетесь заставить всплывающую подсказку отличаться от всплывающей подсказки. По определению, всплывающая подсказка представляет собой «маленькую« рамку для всплывающих подсказок »с информацией о наведенном элементе».

Если пользователь не может прочитать то, что подсказка пытается предложить в течение 30 секунд, то это на самом деле не «совет», а целая глава из файла справки. Вставьте подробные инструкции в Руководство и не пытайтесь втиснуть их во всплывающую подсказку, которая всегда открыта.

1 голос
/ 05 мая 2009

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

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

Почему ярлык на панели? - так что действительно большие подсказки могут прокручиваться - хотя это все еще не работает хорошо.

Это не очень красиво, и я все еще ищу хороший ответ, если у вас есть (или критика метода, который я использовал).

Я сталкивался с http://www.binarymission.co.uk/,, но их подсказка не отображалась должным образом в моем приложении .NET 3.5. Я до сих пор с ними разговариваю.

1 голос
/ 30 апреля 2009

Это не будет ответом, который вы хотите услышать ... Бросьте свой. Однажды у меня был сценарий, в котором я хотел имитировать поведение всплывающей подсказки на панели инструментов Office для команд клавиш быстрого доступа, и я обнаружил, что стандартный API-интерфейс подсказок слишком ограничен.

Создайте небольшой, простой и не имеющий границ экземпляр формы для каждого элемента управления, для которого требуется всплывающая подсказка. Затем покажите и скройте их немодально, как вы делаете событие mouse-enter или -leave. Пусть конструктор для этого окна получит экземпляр элемента управления пользовательского интерфейса и разрешит ему запрашивать у элемента управления его события, чтобы он мог присоединиться к событиям mouse-enter и -leave, чтобы вам не пришлось связывать их вручную. 1003 *

0 голосов
/ 30 апреля 2009

Может помочь метод ToolTip.StopTimer. Из MSDN:

Класс ToolTip имеет внутренний таймер, который используется для установки длительности отображения всплывающих подсказок. Длительность, связанная с этим таймером, задается через свойство AutoPopDelay. Метод StopTimer останавливает этот внутренний таймер, вызывая модальное отображение любой отображаемой всплывающей подсказки, пока метод Hide не будет вызван или родительская форма не будет свернута, скрыта или закрыта.

0 голосов
/ 30 апреля 2009

Установить для присоединенного свойства ToolTipService.ShowDuration значение int.MaxValue:

<Button 
  Height="23" Width="75"
  Content="Click Me" 
  ToolTip="My ToolTip" ToolTipService.ShowDuration="2147483647" 
/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...