Есть ли способ определить, находится ли мышь в LinkArea элемента управления LinkLabel в C#?C# LabelLink обнаружение LinkArea для положения мыши
Любая помощь была бы принята с благодарностью.
Есть ли способ определить, находится ли мышь в LinkArea элемента управления LinkLabel в C#?C# LabelLink обнаружение LinkArea для положения мыши
Любая помощь была бы принята с благодарностью.
Вы можете использовать Mouse Enter Event
linkLabel1.MouseEnter += new EventHandler(linkLabel1_MouseEnter);
private void linkLabel1_MouseEnter(object sender, EventArgs e)
{
MessageBox.Show("Mouse is within link area");
}
мы можем также навести курсор мыши? –
@ Судхакар Тиллапуди Насколько я знаю. Это будет иметь другой эффект от ввода мыши. При наведении курсора мыши. Мышь должна находиться над контролем в течение нескольких секунд, но ввод мыши сразу –
Это неверно. Это скажет вам, находится ли мышь в границах управления, но не находится ли она по самой ссылке. Например, если у вас есть элемент управления LinkLabel, закрепленный в верхней или нижней части большого контейнера, и выровняйте его влево или вправо, чтобы элемент управления охватывал всю ширину контейнера, но в этой ссылке нет. Если вы перемещаете курсор мыши в пустую область элемента управления помимо текста, событие 'MouseEnter' все равно будет срабатывать. –
Это не может быть сделано. Событие MouseEnter
, предложенное в the other answer на момент написания этой статьи, будет срабатывать в любое время, когда мышь входит в область управления, независимо от того, действительно ли это текст ссылки или нет.
Если границы вашего LinkLabel
ограничены относительно содержания, то событие MouseEnter
может работать достаточно хорошо. Но в случае, когда (например) вы хотите, чтобы ваша ссылка меняла цвет, когда мышь нависает над текстом ссылки, и внутри элемента управления вокруг текста есть много области, тогда этот подход не будет работать.
На несколько несвязанной ноте это также мешает вам определить, какая ссылка в пределах LinkLabel
в настоящее время зависнет, если у вас есть несколько, как указано here.
Еще одна деталь в случае, если кто-то задается вопросом: LinkLabel.LinkArea
не то, что вы ищете. Это определяет, какие символы в пределах LinkLabel
фактически являются частью ссылки, а не той областью, на которой они занимают экран.
Чтобы обернуть, единственный способ получить необходимую функциональность - это реализовать собственный пользовательский элемент управления, который ведет себя аналогично элементу управления Label
или LinkLabel
, но добавляет методы и/или свойства, которые вы необходимость.
Поскольку исходный 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);
}
Вы имеете в виду наведение мыши? –
Это winform, asp.net, wpf? –
winform и мышь над – williamtroup