2009-06-29 6 views
3

Я пишу календарный элемент управления в .Net WinForms, который покажет всплывающую подсказку для каждой даты.Как определить, когда показывать всплывающую подсказку?

Каков наилучший способ определить, когда показывать всплывающую подсказку?

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

Событие MouseHover только начинается с первого поворота после MouseEnter, поэтому я не могу его использовать.

Каков наилучший способ для этого?

EDIT: Я использую WinForms

ответ

6

Задержка между Enter и Hover указан в SystemInformation.MouseHoverTime.

Если по какой-либо причине встроенный код обработки всплывающей подсказки для любой используемой вами структуры пользовательского интерфейса недостаточен, вы можете просто развернуть таймер после каждого MouseMove и показать всплывающую подсказку, когда она срабатывает. Очевидно, вам нужно будет сбросить таймер каждый раз, когда мышь будет перемещена, чтобы предотвратить длинную серию «дождя всплывающих подсказок».

+0

Я также должен показать всплывающую подсказку, если мышь движется, но остается в пределах MouseHoverSize; это сложнее, чем кажется. (Должен ли я хранить каждый ход, чтобы я мог проверить после MouseHoverTime, остался ли он рядом с ним?) – SLaks

+0

@SLaks - вы перезапускали таймер всякий раз, когда мышь оставила прямоугольник, определенный MouseHoverSize, как прочитанный при первом запуске таймера. Вам нужно будет сохранить только один Point/Rect (в зависимости от реализации). –

+0

Нет, потому что, если он остается внутри прямоугольника, он начинался посередине? (Что, если он переместил половину MouseHoverSize, а затем еще три четверти MouseHoverSize, так что он находится в пределах MouseHoverSize точки, в которую он переместился ранее?) – SLaks

0

Посмотрите свойство AutoPopDelay, InitialDelay и ReshowDelay класса ToolTip, так как они контролируют поведение подсказки.

Обычно я играю со значениями, пока не получу то, что «чувствует» право. Это раздражает, когда всплывающая подсказка показывает сразу, а для коротких всплывающих подсказок это также раздражает, когда они исчезают слишком рано. Для действительно длинных всплывающих подсказок, скажем, несколько абзацев (да, плохое дизайнерское решение, но если есть много информации для чтения, по крайней мере, позвольте мне прочитать ее!), Тогда она должна оставаться открытой, пока моя мышь неподвижна.

A tooltip example из MSDN дает следующие значения:

AutoPopDelay = 5000; 
InitialDelay = 1000; 
ReshowDelay = 500; 
// Force the ToolTip text to be displayed whether or not the form is active. 
ShowAlways = true; 

Как уже упоминалось в комментариях, плакат хочет, чтобы вызвать всплывающую подсказку программно. Для этого нужно вызвать ToolTip.Show(). Чтобы получить эффект задержки, вы, скорее всего, захотите запустить таймер, который подсчитывает время, в течение которого мышь неподвижна. Всякий раз, когда мышь входит, уходит или перемещается внутри элемента управления, это время должно быть сброшено.

+0

Проблема в том, что я хочу показать всплывающую подсказку, когда каждая ячейка зависает, а не только когда наведет весь элемент управления. Класс ToolTip (AFAIK) не поддерживает это изначально, поэтому я должен показать его сам. Вопрос в том, когда я должен показать это? – SLaks

0

Было бы полезно знать, какие технологии вы используете, потому что все они имеют различные способы реализации всплывающих подсказок (ASP.NET Forms в WPF??):

  • С ASP.NET, вы можете просто установить свойство ToolTip элемента управления (например, в качестве элемента управления меткой, которое показывает номер в вашем календаре), и оно автоматически покажет всплывающую подсказку после небольшой задержки при наведении над элементом управления.
  • В Формах, я думаю, вы должны на самом деле создать объект ToolTip, а затем прикрепить к нему элемент управления.
  • В WPF вы можете добавить элемент Label.ToolTip к вашему коду XAML.

Во всех случаях, однако, есть встроенный способ сделать это, поэтому вам может не понадобиться писать свой собственный код вообще.

Если ваша ситуация настолько обычна, что вам нужно написать свой собственный код, мне действительно нужно будет узнать больше о том, как вы представляете числа в своем календаре, чтобы помочь вам.

Последняя вещь: вы действительно не спрашивали об этом - и это может быть не под вашим контролем - но вы можете спросить себя, является ли всплывающая подсказка лучшим способом отображения информации календаря в первую очередь.Если пространство действительно жесткое, тогда ответ может быть «да», но если у вас достаточно места для отображения событий календаря (или даже первых нескольких слов каждого события), это избавит пользователя от необходимости «счистить все» календарь "(т. е. перематывать каждую дату отдельно).

Дан

+0

«Во всех случаях, однако, есть встроенный способ сделать это, поэтому вам может не понадобиться писать свой собственный код». - Так неправда. Это справедливо для простых ситуаций (т. Е. Зависания над кнопкой), но в некоторых элементах управления вам необходимо самостоятельно контролировать поведение, и это не облегчается из-за поведения MouseHover. –

+0

Hi Ed, Итак, я предполагаю, что даже встроенный элемент управления ToolTip зависит от MouseHover, и он просто недостаточно надежен, чтобы показывать подсказку каждый раз? Наверное, я заметил это несколько раз. В этом случае, интересно, работает ли что-то вроде этого: 1. В Control_MouseEnter создайте объект Timer с интервалом = 500 мс. 2. На Timer_Elapsed покажите всплывающую подсказку. 3. В Control_MouseLeave скройте всплывающую подсказку. – devuxer

+0

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