2016-05-15 3 views
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()callback2()の両方が呼び出されます。ワンクリックでクリックし、LinkClickedイベントハンドラ

callback2()に電話するにはどうすればよいですか?

+0

2つのラベルを使用します。 –

答えて

2

2つの解決策が考えられます。最初は非常に愚かなものですが、かなり効果的です。マウスがリンク上を移動するときにクリックしたくない。どちらが副作用があり、マウスカーソルが変化します。だから、カーソル形状チェックすることでフィルタリングできます:あなたは、リンクのラベルをたくさん持っている場合はもう少し原則に基づいと便利

private void linkLabel1_Click(object sender, EventArgs e) { 
    if (Cursor.Current == Cursors.Default) { 
     Debug.WriteLine("Click!"); 
     // etc... 
    } 
} 

をマウスがリンクの上にある場合は、すべてクリックしてイベントを発生させないことです。プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。

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

カーソルのアイデアは単に素晴らしいですし、まさに私が望んでいたものです。キーボードのタブを使用してリンクをマークし、Enterキーを押すとLinkClickedだけが呼び出され、リンクをクリックするとClickとLinkClickedの両方が呼び出されることに注意してください。どうもありがとう。 – LukAss741

+0

ああ、それは本当です。ありがとう。 –

2

私はそれを行う方法がありません。

reference sourceのように、LinkLabelは、Labelに由来します。 Clickイベントは、Labelベースクラスによって発生します。 OnMouseDownOnMouseUpのような基本メソッドは、LinkLabelがこれらのイベントを処理する前に常に呼び出されることがコードで分かります。

したがってベースの実装では、LinkClickedの実装でLinkLabelイベントが発生する前に常にClickイベントが発生します。それを防ぐための財産や旗はありません。

あなたは望みどおりにあなたが望むように異なる方法で達成することができます。

関連する問題