2016-05-15 180 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()被稱爲這是正確的。
如果我點擊標籤的鏈接,則調用callback1()callback2()點擊呼叫點擊和LinkClicked事件處理程序

我該如何撥打callback2()

+0

使用兩個單獨的標籤。 –

回答

2

我能想到的兩種解決方案。第一個是非常愚蠢的,但看起來非常有效。當鼠標懸停在鏈接上時,您不喜歡點擊。其中有一個副作用,鼠標光標改變。如果你有很多的鏈接標籤的是,如果鼠標在鏈接根本提高Click事件

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

光標的想法簡直太棒了,正是我想要的。請注意,當您使用鍵盤上的標籤標記鏈接並按下回車鍵時,只會調用LinkClicked,而如果您單擊該鏈接,則會調用Click和LinkClicked。非常感謝。 – LukAss741

+0

啊,的確如此。謝謝。 –

2

我看不出有辦法做到這一點。

正如您在reference source中看到的,LinkLabel源自LabelClick事件由Label基類引發。您可以在代碼中看到,OnMouseDownOnMouseUp等基本方法總是在LinkLabel處理這些事件之前調用。

所以LinkClicked執行引發LinkLabel事件之前的Label基實現總是會提出一個Click事件。沒有財產或國旗來阻止這一點。

你希望能以不同的方式實現你想要的。