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()
?
我能想到的两种解决方案。 第一个非常愚蠢,但看起来很有效。 您不喜欢将鼠标悬停在链接上时单击。 这有一个副作用,鼠标光标会改变。 因此,您可以通过检查光标形状进行过滤:
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);
}
}
我看不出有什么办法可以做到这一点。
正如您在参考源中看到的,LinkLabel
派生自Label
。Click
事件由Label
基类引发。您可以在代码中看到,OnMouseDown
和 OnMouseUp
等基方法总是在LinkLabel
处理这些事件之前调用这些事件。
因此,Label
基本实现将始终在引发LinkClicked
实现引发LinkLabel
事件之前引发Click
事件。没有属性或标志可以防止这种情况。
你希望能以不同的方式实现你想要的。