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()
?
答案 0 :(得分:2)
我没有办法做到这一点。
正如您在reference source中看到的那样,LinkLabel
来自Label
。 Click
基类引发Label
事件。您可以在代码中看到,在OnMouseDown
处理这些事件之前,始终会调用OnMouseUp
和LinkLabel
等基本方法。
因此,在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);
}
}