2013-12-03 3 views
1

Есть ли способ определить, находится ли мышь в LinkArea элемента управления LinkLabel в C#?C# LabelLink обнаружение LinkArea для положения мыши

Любая помощь была бы принята с благодарностью.

+0

Вы имеете в виду наведение мыши? –

+1

Это winform, asp.net, wpf? –

+0

winform и мышь над – williamtroup

ответ

1

Вы можете использовать Mouse Enter Event

linkLabel1.MouseEnter += new EventHandler(linkLabel1_MouseEnter); 

private void linkLabel1_MouseEnter(object sender, EventArgs e) 
{ 
    MessageBox.Show("Mouse is within link area"); 
} 
+0

мы можем также навести курсор мыши? –

+0

@ Судхакар Тиллапуди Насколько я знаю. Это будет иметь другой эффект от ввода мыши. При наведении курсора мыши. Мышь должна находиться над контролем в течение нескольких секунд, но ввод мыши сразу –

+0

Это неверно. Это скажет вам, находится ли мышь в границах управления, но не находится ли она по самой ссылке. Например, если у вас есть элемент управления LinkLabel, закрепленный в верхней или нижней части большого контейнера, и выровняйте его влево или вправо, чтобы элемент управления охватывал всю ширину контейнера, но в этой ссылке нет. Если вы перемещаете курсор мыши в пустую область элемента управления помимо текста, событие 'MouseEnter' все равно будет срабатывать. –

0

Это не может быть сделано. Событие MouseEnter, предложенное в the other answer на момент написания этой статьи, будет срабатывать в любое время, когда мышь входит в область управления, независимо от того, действительно ли это текст ссылки или нет.

Если границы вашего LinkLabel ограничены относительно содержания, то событие MouseEnter может работать достаточно хорошо. Но в случае, когда (например) вы хотите, чтобы ваша ссылка меняла цвет, когда мышь нависает над текстом ссылки, и внутри элемента управления вокруг текста есть много области, тогда этот подход не будет работать.

На несколько несвязанной ноте это также мешает вам определить, какая ссылка в пределах LinkLabel в настоящее время зависнет, если у вас есть несколько, как указано here.

Еще одна деталь в случае, если кто-то задается вопросом: LinkLabel.LinkArea не то, что вы ищете. Это определяет, какие символы в пределах LinkLabel фактически являются частью ссылки, а не той областью, на которой они занимают экран.

Чтобы обернуть, единственный способ получить необходимую функциональность - это реализовать собственный пользовательский элемент управления, который ведет себя аналогично элементу управления Label или LinkLabel, но добавляет методы и/или свойства, которые вы необходимость.

0

Поскольку исходный LinkLabel имеет защищенную функцию PointInLink это не трудно сделать:

using System; 
using System.Windows.Forms; 

namespace MyControlNameSpace 
{ 
    /// <summary> 
    /// Data for a HoveredLinkChanged-Handler. 
    /// </summary> 
    public class HoveredLinkChangedEventArgs : EventArgs 
    { 
     private readonly LinkLabel.Link m_Link; 

     /// <summary> 
     /// Creates data for a HoveredLinkChanged-Handler 
     /// </summary> 
     /// <param name="link">the Link, with the mouse pointer over it</param> 
     public HoveredLinkChangedEventArgs(LinkLabel.Link link) 
     { 
      m_Link = link; 
     } 

     /// <summary> 
     /// Returns the hovered Link 
     /// </summary> 
     public LinkLabel.Link HoveredLink 
     { 
      get { return m_Link; } 
     } 
    } 

    /// <summary> 
    /// The structure of a HoveredLinkChanged-Handler 
    /// </summary> 
    public delegate void HoveredLinkChangedEventHandler(
       object sender, HoveredLinkChangedEventArgs e); 

    /// <summary> 
    /// Adds to LinkLabel the possiblity to react on changes 
    /// of the hovered Link (e.g. to alter a TooltipText). 
    /// </summary> 
    public class LinkLabelEx : LinkLabel 
    { 
     private Link m_HoveredLink; 

     /// <summary> 
     /// Occurs, when another Link is hovered. 
     /// </summary> 
     public event HoveredLinkChangedEventHandler HoveredLinkChanged; 

     /// <summary> 
     /// Raises the HoveredLinkChanged event 
     /// </summary> 
     /// <param name="hoveredLink">the hovered Link</param> 
     protected virtual void OnHoveredLinkChanged(Link hoveredLink) 
     { 
      if (HoveredLinkChanged != null) 
       HoveredLinkChanged(this, 
        new HoveredLinkChangedEventArgs(hoveredLink)); 
     } 

     /// <summary> 
     /// Raises the Control.OnMouseMove(MouseEventArgs) event. 
     /// </summary> 
     /// <param name="e">a MouseEventArgs containing the event data</param> 
     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 
      Link currentLink = PointInLink(e.X, e.Y); 
      if (Equals(currentLink, m_HoveredLink)) return; 
      m_HoveredLink = currentLink; 
      OnHoveredLinkChanged(m_HoveredLink); 
     } 
    } 
} 

Тогда есть только две вещи, осталось сделать:

Добавить EventHandler к вашему LinkLabelEx, например:

linkLabelEx1.HoveredLinkChanged += linkLabelEx1_HoveredLinkChanged; 

Установите ToolTipText по ссылке, приведенной в EventArgs, например:

void linkLabelEx1_HoveredLinkChanged(object sender, HoveredLinkChangedEventArgs e) 
{ 
    string ttt = e.Link == null 
     ? string.Empty 
     : e.Link.Description; 
    toolTip1.SetToolTip((Control)sender, ttt); 
}