2013-12-03 33 views

回答

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

@SudhakarTillapudi就我所知。它将与鼠标输入有不同的效果。在鼠标悬停。鼠标必须超过控制几秒钟,但鼠标输入立即 – 2013-12-03 18:31:16

+0

这是不正确的。这将告诉你鼠标是否在控制范围内,而不是它是否实际在链路本身。一个例子是,如果您有一个LinkLabel控件停靠在大容器的顶部或底部,并将其左对齐或右对齐,以便控件覆盖整个容器宽度,但其内部的链接不对齐。如果将鼠标光标移动到除文本之外的控件的空白区域,则“MouseEnter”事件仍会触发。 –

0

这不能做。在撰写本文时,the other answer中建议的MouseEnter事件将在鼠标进入控制区域时触发,而不管它是否实际上是链接文本。

如果您的LinkLabel控件的边界相对于其内容较小,那么MouseEnter事件可能运行得足够好。但是,如果(例如)当鼠标悬停在链接文本上并且文本中的控件周围存在大量区域时,您希望链接改变颜色,则此方法无效。

在一个有点不相干的笔记上,这也可以防止您检测LinkLabel中的哪个链接目前正在被覆盖,如果您有多个链接,如here所述。

有人想知道更多的细节:LinkLabel.LinkArea财产不是你正在寻找,要么。这只会确定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); 
     } 
    } 
} 

再就是只有两件事情剩下要做的:

添加事件处理程序到您的LinkLabelEx,如:

linkLabelEx1.HoveredLinkChanged += linkLabelEx1_HoveredLinkChanged; 

设置根据EventArgs的给出的链接,例如的ToolTipText:

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