一键式同时调用 Click 和 LinkClicked 事件处理程序


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派生自LabelClick事件由Label基类引发。您可以在代码中看到,OnMouseDownOnMouseUp 等基方法总是在LinkLabel处理这些事件之前调用这些事件。

因此,Label 基本实现将始终在引发LinkClicked实现引发LinkLabel事件之前引发Click事件。没有属性或标志可以防止这种情况。

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

相关内容

  • 没有找到相关文章

最新更新