3
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()只调用?

4

2 回答 2

2

我没有办法做到这一点。

正如您在参考源中看到的那样,LinkLabel源自Label. 该Click事件由Label基类引发。您可以在代码中看到基本方法喜欢OnMouseDown并且OnMouseUp总是在LinkLabel处理这些事件之前被调用。

因此,Label基本实现将始终在实现引发Click事件之前引发事件。没有财产或旗帜可以防止这种情况发生。LinkClickedLinkLabel

你希望能以不同的方式实现你想要的。

于 2016-05-15T11:57:19.247 回答
2

我能想到的两个解决方案。第一个非常愚蠢,但看起来非常有效。当鼠标悬停在链接上时,您不喜欢单击。其中有一个副作用,鼠标光标会发生变化。因此,您可以通过检查光标形状进行过滤:

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);
    }
}
于 2016-05-15T12:20:07.153 回答