0

我正在尝试分配一个事件处理程序,该处理程序使用将 System.EventArgs 扩展到 ToolStripMenuItem 的事件参数。当我输入处理程序的名称时,它想创建一个使用 System.EventArgs 的事件处理程序。这是最近文件的列表。

这是代码

RecentEventArgs e = new RecentEventArgs();
e.FileName = item;
ToolStripMenuItem recentItem = new ToolStripMenuItem(item);
recentItem.Click += new EventHandler(RecentItem_Click);
mnuFileOpenRecentList.DropDownItems.Add(item);

private void RecentItem_Click(object sender, RecentEventArgs e)
{
    MessageManager.DisplayMessageBox("File -> Open Recent ->");
    OpenRecentFile(e.FileName);
    }

public class RecentEventArgs : EventArgs
{
    private string fileName;

    public RecentEventArgs()
        :base()
    {

    }

    public string FileName
    {
        get { return fileName; }
        set { fileName = value; }
    }
}

对此的任何帮助将不胜感激。

4

1 回答 1

0

您正朝着正确的方向前进,但您错过了一些关键部分。请记住,c# 中的所有内容都是强类型的,这意味着所有方法签名都不能在运行时更改它们的任何参数。这也适用于委托(如果您订阅事件,这就是您正在使用的)。

由于您已经拥有自定义 EventArgs,因此仍然缺少一个委托,该委托描述您的新事件(因为这是您所追求的)将要调用的方法签名。

// the public delegate with the custom eventargs
public delegate void RecentEventHandler(object sender, RecentEventArgs e);

现在,您想要一些充当 ToolStripMenuItem 但触发“最近”事件的东西,它被单击并将您的自定义事件参数作为有效负载发送。让我们创建一个子类来处理该逻辑:

public class RecentFileMenuItem:ToolStripMenuItem
{
    private string filename; // holds your path+file

    // constructur
    public RecentFileMenuItem(string filename)
        :base(Path.GetFileName(filename))
    {
        // keep our filename
        this.filename = filename;
    }

    // event delegate, subscribe to this
    public RecentEventHandler Recent;

    // click invokes all subscribers 
    // for the Recent Event
    protected override void OnClick(EventArgs e)
    {
        RecentEventHandler recent = Recent;
        if (recent !=null)
        {
            // create your RecentEventArgs here
            recent(this, new RecentEventArgs { FileName = filename });
        }
    }
}

在上面的类中,我重写了默认的 OnClick 处理程序来调用最近事件的任何订阅者,我们在其中创建了一个新的 RecentEventArgs。注意Recenttype 的委托RecentEventHandler

随着这些位的工作,我们需要让我们的课程发挥作用。

    private void Form3_Load(object sender, EventArgs e)
    {
        RecentFileMenuItem recentItem = new RecentFileMenuItem("foo");

        mnuFileOpenRecentList.DropDownItems.Add(recentItem);

        recentItem.Recent += new RecentEventHandler(Show); 
    }

    // method signature that matches our RecentEventHandler delegate
    public void Show(object s, RecentEventArgs e)
    {
        MessageBox.Show(e.FileName);
    }

在这里,我们看到我们RecentFileMenuItem在构造函数中添加了一个带有文件名的新实例到最近列表中。该方法与签名匹配,因此我们可以使用指向该方法的委托Show订阅事件。Recent

于 2015-07-11T11:46:49.183 回答