2016-03-18 23 views
1

我使用WinForms在C#中创建应用程序。C#如何使用基类中的EventArgs

我想要的:
我想要一个带有箭头的按钮。当按下带箭头的按钮部分时,它将显示一个下拉菜单,但如果按钮的其他部分被按下,则应该触发鼠标点击事件。

我需要什么帮助:
我相信我可以用鼠标位置做鼠标的位置检查,但我怎么能确保该按钮的情况下,事件处理程序只能有一个“鼠标按钮“事件时,它是按钮的主要部分被点击?即我如何在基础处理程序中吃掉事件,以便它永远不会到达派生的事件?

我有什么:
我的代码结构(简体)如下(从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'事件,或者您是否试图阻止'override void OnClick'被完全调用? –

回答

0

我认为问题在于您错误地接线了Control.MouseClick而不是Control.Click。所以,如果你overrideOnClick方法,并希望它会阻止OnMouseClick被调用,你是错误的。

有很多不同的事件和每个override映射到每个event立足于“开”的命名惯例,加上事件的名称,例如:

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

整个列表中存在here on MSDN。此外,您可以查看Control.cshere的来源。你可以很容易地看到所有的事件都遵循相同的模式,因为它们暴露在被覆盖的位置。

假设您处理了正确的event,最终您可以通过重写base行为来完全控制您的控件。