2016-03-18 3 views
1

Я создаю приложение на C# с помощью WinForms.C# Как использовать EventArgs в базовом классе

Что я хочу:
Я хочу кнопку со стрелкой на стороне. Когда часть кнопки со стрелкой будет нажата, она отобразит выпадающее меню, но если какая-либо другая часть кнопки нажата, она должна вызвать событие щелчка мыши.

Что мне нужна помощь с:
Я уверен, что я могу сделать мышь позиционной проверку с помощью мыши позицию, но как я могу убедиться, что обработчик событий для экземпляров кнопки есть только «мышь button down ", когда была нажата основная часть кнопки? То есть как я могу съесть событие в базовом обработчике, чтобы он никогда не доходил до производного?

Что у меня есть:
Моя структура кода (упрощенно) следующим образом (взяты из Windows.Forms button with drop-down menu):

// Button class: 
public class ButtonWithDropDown : Button 
{ 
    protected override void OnClick(EventArgs e) 
    { 
     // Check for when the mouse is on the button and dispose of the 
     // event if it's over the 'arrow' part of the button. 
    } 
} 

// Event handler: 
private void btnClickMe_Click(object sender, EventArgs e) 
{ 
    MouseEventArgs mevent = (MouseEventArgs)e; 
    if (mevent.Button == System.Windows.Forms.MouseButtons.Left) 
     MessageBox.Show("Only shown when clicking the main part of the button"); 
} 

Спасибо.

+0

Имейте пустое 'override', в котором вы не называете' base'. –

+0

@ David Pine Как в примере кода? (Мой фактический код вызывает 'base.OnClick (e)') К сожалению, я попытался удалить его, и он все еще проходит через событие. – Edward

+0

Вы пытаетесь избежать события «.Click» от каких-либо слушателей или пытаетесь ли вы вообще запретить «переопределить void OnClick»? –

ответ

0

Я думаю, что проблема в том, что вы неправильно подключили Control.MouseClick вместо Control.Click. Итак, если вы используете override метод OnClick и надеетесь, что это предотвратит вызов OnMouseClick, вы ошибаетесь.

Есть много различных событий, и каждый override карты каждому event на основе именования «On» плюс имя события, например:

┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 
┃ event name ┃ protected virtual method ┃ 
┣━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
┃ Click  ┃ OnClick     ┃ 
┃ MouseClick ┃ OnMouseClick    ┃ 
┃ ...  ┃ On...     ┃ 
┗━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 

Весь список существует here on MSDN. Кроме того, вы можете просмотреть источник для Control.cshere. Вы можете легко увидеть, что все события следуют одному и тому же шаблону, поскольку они выставлены для переопределения.

В конечном счете, у вас есть полный контроль над вашим управлением, переопределив поведение base, предполагая, что вы обрабатываете правильные event.

Смежные вопросы