2013-12-03 62 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); 
}