2016-05-15 6 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().один клик вызывает как Click и обработчики событий LinkClicked

Как мне позвонить callback2()?

+0

использовать две отдельные этикетки. –

ответ

2

Два решения, о которых я могу думать. Первый - очень глупый, но выглядит довольно эффектно. Вам не нравится Click, когда мышь наводится на ссылку. Который имеет побочный эффект, курсор мыши изменяется. Таким образом, можно фильтровать, проверяя форму курсора:

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

Идея курсора просто велика и делает именно то, что я хотел. Обратите внимание, что когда вы помечаете ссылку, используя вкладку на клавиатуре, и нажимаете клавишу ввода, вызывается только LinkClicked, а если вы нажмете ссылку, вызывается оба Click и LinkClicked. Большое спасибо. – LukAss741

+0

А, это правда. Благодарю. –

2

Я не вижу способа сделать это.

Как вы можете видеть в reference source, LinkLabel происходит от Label. Событие Click поднимается базовым классом Label. Вы можете видеть в коде, что базовые методы, такие как OnMouseDown и OnMouseUp, всегда вызываются до того, как LinkLabel обрабатывает эти события.

Так Реализация Label база всегда будет поднимать Click события перед LinkClicked реализацией поднимает LinkLabel события. Для предотвращения этого нет никакого свойства или флага.

Вы, надеюсь, можете достичь того, чего хотите по-другому.