我正在尝试分配一个事件处理程序,该事件处理程序使用将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; }
}
}
对此的任何帮助将不胜感激。
答案 0 :(得分:0)
你正朝着正确的方向前进,但你错过了一些关键部分。请记住,c#中的所有内容都是强类型的,这意味着所有方法签名都无法在运行时更改其任何参数。对于delegates也是如此(如果您订阅活动,那就是您正在使用的内容)。
由于您已经拥有自定义的EventArgs,所以仍然缺少的是一个委托,它描述了您的新事件(因为这就是您所追求的)将要调用的方法签名。
// the public delegate with the custom eventargs
public delegate void RecentEventHandler(object sender, RecentEventArgs e);
现在你需要一些充当ToolStripMenuItem的东西,但会触发Recent事件,它会被点击并发送你的自定义eventargs作为有效负载。让我们创建一个子类来处理该逻辑:
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的Recent事件的任何订阅者。请注意类型为Recent
的{{1}}委托。
有了这些位,我们需要让我们的课程发挥作用。
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
事件。