c# - 如何为事件定义自定义事件参数?

标签 c# events delegates event-handling

我想为一系列事件创建自定义 Eventargs。我使用第三方 X/Y 范围来绘制强度与频率的关系。该示波器能够在其上放置“标记”,这些“标记”只是各种频率的小三角形。这些标记支持诸如鼠标进入标记、执行单击以及鼠标离开标记等事件。因此,对于两个标记,代码如下:

        private void createEvents()
        {
            this.scope2.MarkerGroups[0].Click += new EventHandler(Marker0_Click);
            this.scope2.MarkerGroups[0].MouseEnter += new EventHandler(Marker0_Enter);
            this.scope2.MarkerGroups[0].MouseLeave += new EventHandler(Marker0_Leave);

            this.scope2.MarkerGroups[1].Click += new EventHandler(Marker1_Click);
            this.scope2.MarkerGroups[1].MouseEnter += new EventHandler(Marker1_Enter);
            this.scope2.MarkerGroups[1].MouseLeave += new EventHandler(Marker1_Leave);
        }
        // And now the event handlers

        private void Marker0_Click(object sender, EventArgs e)
        {
            //do something;           
        }

        private void Marker0_Enter(object sender, EventArgs e)
        {
              //do something          
        }

        private void Marker0_Leave(object sender, EventArgs e)
        {
            // do something
        }

        private void Marker1_Click(object sender, EventArgs e)
        {
            //do something;           
        }

        private void Marker1_Enter(object sender, EventArgs e)      
        {
              //do something          
        }

        private void Marker1_Leave(object sender, EventArgs e)
        {
            // do something
        }

现在这对于两个标记来说没问题……但我需要 80 个。我可以把整个事情写出来,但必须有更好的方法。所以我是这样开始的:

    private void createMarkerEvents()
    {
        for (int i = 0; i < 80; i++)
        {
            this.scope2.MarkerGroups[i].Click += new EventHandler(Marker_Click);
            this.scope2.MarkerGroups[i].MouseEnter += new EventHandler(Marker_Enter);
            this.scope2.MarkerGroups[i].MouseLeave += new EventHandler(Marker_Leave);
        }
     }

        private void Marker_Click(object sender, EventArgs e)
        {
            //do something;           
        }

        private void Marker_Enter(object sender, EventArgs e)
        {
              //do something          
        }

        private void Marker_Leave(object sender, EventArgs e)
        {
            // do something
        }

所以问题是如何将实际标记编号从事件传递到事件处理程序? 必须有办法。 谢谢,汤姆

最佳答案

如果您想识别标记组,您可以将 object sender 转换为 MarkerGroup 对象

private void AnyMarker_Click(object sender, EventArgs e)
{
    MarkerGroup group = (MarkerGroup)sender;
    int indexOfMarkerGroup = this.scope2.MarkerGroups.IndexOf(group);
    //do something;           
}

关闭:您应该定义一个自定义 EventArgs 类:

public class MyEventArgs : EventArgs
{
    public int MyCustomProperty {get;set;}
}

然后在您的事件中使用它:

public event EventHandler<MyEventArgs> ButtonPressed;

使用自定义参数触发事件:

if(ButtonPressed != null)
{
    ButtonPressed(this, new MyEventArgs { MyCustomProperty = 1 });
}

编辑 完整示例:

private void createMarkerEvents()
{
    for (int i = 0; i < 80; i++)
    {
        this.scope2.MarkerGroups[i].Click += new EventHandler(Marker_Click);
        this.scope2.MarkerGroups[i].MouseEnter += new EventHandler(Marker_Enter);
        this.scope2.MarkerGroups[i].MouseLeave += new EventHandler(Marker_Leave);
    }
 }

 private void Marker_Click(object sender, EventArgs e)
 {
     // When markergroup fires and event, it passes reference to itself as `sender` parameter
     // so we can get access it
     MarkerGroup mg = (MarkerGroup)sender; // this marker has fired a click event
     // Now you know which marker has fired event
     // if you want to determine it's index in MarkerGroups collection:
     int index = this.scope2.MarkerGroup.IndexOf(mg);

     // now you know MarkerGroup and it's index
 }

 private void Marker_Enter(object sender, EventArgs e)
 {
    //do something          
 }

 private void Marker_Leave(object sender, EventArgs e)
 {
    // do something
 }

关于c# - 如何为事件定义自定义事件参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577103/

相关文章:

c# - 如何检测点击当前选定的 PivotItem 的标题

c# - 为什么在调用之前为事件分配处理程序?

events - Python 事件与 tkinter 绑定(bind)

c# - 将委托(delegate)引用传递给另一个类以便一个订阅者可以监听多个发布者?

c# - 如何在 C# 2.0 中从 List<> 获取最后一个对象

c# - 将无效日期处理为有效日期?

c# - 如何退出由 URL SCHEME 打开的统一应用程序并返回主应用程序?

c# - 明确指定模型数据类型 MVC/C#

ios - 什么时候使用像 (id<UISearchBarDelegate>)self 这样的东西?

swift - CollectionView 的 NSFetchedResultsControllerDelegate