单击一次即可调用Click和LinkClicked事件处理程序

时间:2016-05-15 11:49:30

标签: c# .net event-handling click linklabel

LinkLabel label = new LinkLabel();
// imagine there is a code to initialize the label
label.Click += (sender, args) => callback1();
label.LinkClicked += (sender, args) => callback2();

如果我在任何地方点击标签而不是其链接,则会调用callback1(),这是正确的 如果我点击标签的链接,则会调用callback1()callback2()

如何仅拨打callback2()

2 个答案:

答案 0 :(得分:2)

我没有办法做到这一点。

正如您在reference source中看到的那样,LinkLabel来自LabelClick基类引发Label事件。您可以在代码中看到,在OnMouseDown处理这些事件之前,始终会调用OnMouseUpLinkLabel等基本方法。

因此,在Label实施引发Click事件之前,LinkClicked基础实施将始终引发LinkLabel事件。没有任何财产或旗帜可以防止这种情况发生。

您希望以不同的方式实现您想要的目标。

答案 1 :(得分:2)

我能想到的两种解决方案。第一个是非常愚蠢的,但看起来非常有效。当鼠标悬停在链接上时,您不喜欢Click。哪个有副作用,鼠标光标会改变。所以你可以通过检查光标形状来过滤:

private void linkLabel1_Click(object sender, EventArgs e) {
    if (Cursor.Current == Cursors.Default) {
       Debug.WriteLine("Click!");
       // etc...
    }
}

如果你有很多链接标签,那么更有原则性和方便性的是,如果鼠标位于链接上,则根本不会引发Click事件。在项目中添加一个新类并粘贴此代码:

using System;
using System.Windows.Forms;

class LinkLabelEx : LinkLabel {
    protected override void OnClick(EventArgs e) {
        var loc = this.PointToClient(Cursor.Position);
        if (this.PointInLink(loc.X, loc.Y) == null) base.OnClick(e);
    }
}