1

有没有办法确定鼠标是否在 C# 中的 LinkLabel 控件的 LinkArea 内?

任何帮助将不胜感激。

4

3 回答 3

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");
}
于 2013-12-03T18:22:59.140 回答
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);
}
于 2017-09-20T09:53:13.723 回答
0

这是无法做到的。在撰写本文时,其他答案中建议的MouseEnter事件将在鼠标进入控制区域时触发,无论它是否实际上位于链接文本上。

如果您的LinkLabel控件的边界相对于其内容而言较小,则该MouseEnter事件可能运行良好。但是,如果(例如)您希望您的链接在鼠标悬停在链接文本上时更改颜色并且文本周围的控件中有很多区域,那么这种方法将不起作用。

在一个有点不相关的注释中,如果您有多个链接,这也会阻止您检测LinkLabel当前正在悬停的链接中的哪个链接,如此所述。

如果有人想知道,还有一个细节:该LinkLabel.LinkArea物业也不是您要找的。这仅确定其中的哪些字符LinkLabel实际上是链接的一部分,而不是它们在屏幕上占据的实际区域。

总而言之,您可能能够获得您正在寻找的功能的唯一方法是实现您自己的自定义控件,该控件的行为类似于LabelorLinkLabel控件,但添加了您需要的方法和/或属性。

于 2017-04-19T18:17:16.530 回答