【问题标题】:one click calls both Click and LinkClicked event handlers一键调用 Click 和 LinkClicked 事件处理程序
【发布时间】:2016-05-15 11:49:30
【问题描述】:
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()

【问题讨论】:

  • 使用两个单独的标签。

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


【解决方案1】:

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

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);
    }
}

【讨论】:

  • 光标的想法简直太棒了,完全符合我的要求。请注意,当您使用键盘上的选项卡标记链接并按 Enter 键时,只会调用 LinkClicked,而如果您单击该链接,则会调用 Click 和 LinkClicked。非常感谢。
  • 啊,原来如此。谢谢。
【解决方案2】:

我没有办法做到这一点。

正如您在reference source 中看到的,LinkLabel 派生自LabelClick 事件由 Label 基类引发。您可以在代码中看到OnMouseDownOnMouseUp 等基本方法始终在LinkLabel 处理这些事件之前被调用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2010-12-04
    • 2014-05-25
    相关资源
    最近更新 更多