我是C#和WinForms的新手。我有一些右键单击(上下文菜单)事件的对象。但是,根据上下文(例如,取决于用户是在向导屏幕还是主屏幕中),我想改变右键单击的内容。我用Google搜索了一下,发现我可以使用+=
和-=
运算符,但我仍然无法实现我想要做的事情。给出下面的代码,例如,
有什么想法吗?
编辑:我希望OnClickCard
在不同的地方表现不同。
Sammple代码:
public override ContextMenuStrip GetContextMenuStrip(GoView view)
{
if (Selectable)
{
ContextMenuStrip contextMenu = new ContextMenuStrip();
if (!Empty)
{
// this is just for example so not showing the implementation
contextMenu.Items.Add(new ToolStripMenuItem(
"Delete",
null,
new EventHandler(OnClickDelete)));
}
// Empty
else
{
ToolStripMenuItem addCard = new ToolStripMenuItem("Add");
foreach (..some data..)
{
ToolStripMenuItem card = new ToolStripMenuItem(
data,
null,
new EventHandler(OnClickCard));
addCard.DropDownItems.Add(card);
}
}
}
else
{
return null;
}
}
private void OnClickCard(object sender, EventArgs e)
{
ToolStripMenuItem cardItem = (ToolStripMenuItem)sender;
if (cardItem.Text.Contains("ABC"))
{
Common.Forms.FormMMUSettings f = new FormMMUSettings(cardItem.Text,ParentMagazine.NextSite);
f.Show();
}
SetCard(new MagazineCard(2, cardItem.Text));
}
答案 0 :(得分:1)
您是说要根据单击时的情况更改上下文菜单的内容?如果是这样,最简单的方法是创建多个上下文菜单,只需使用一个事件来设置您想要的任何上下文菜单。
ContextMenu menu1 = new ContextMenu();
MenuItem menu1Item1 = new MenuItem();
menu1Item1.Header = "Menu 1 Item 1";
menu1Item1.Click += new RoutedEventHandler(menu1Item1Clicked);
menu1.Items.Add(mnu1Item1);
MenuItem menu1Item2 = new MenuItem();
menu1Item2.Header = "Menu 1 Item 2";
menu1Item2.Click += new RoutedEventHandler(menu1Item2Clicked);
menu1.Items.Add(menu1Item2);
ContextMenu menu2 = new ContextMenu();
MenuItem menu2Item1 = new MenuItem();
menu2Item1.Header = "Menu 2 Item 1";
menu2Item1.Click += new RoutedEventHandler(menu2Item1Clicked);
menu2.Items.Add(menu2Item1);
MenuItem menu2Item2 = new MenuItem();
menu2Item2.Header = "Menu 2 Item 2";
menu2Item2.Click += new RoutedEventHandler(menu2Item2Clicked);
menu2.Items.Add(menu2Item2);
public void menu1Item1Clicked(object sender, EventArgs e)
{
}
etc..
现在您只需设置所需的菜单:
myForm.ContextMenu = menu1;
希望这有帮助。
答案 1 :(得分:0)
+=
和-=
应该可以正常工作,但我建议你使用一种处理器仓库来切换要使用的处理程序。这应该像strategy模式一样工作,其中不同的向导步骤将是不同的策略。
如果您向我们展示一些代码并指出哪些代码部分无法正常工作,那么帮助您会更容易。
答案 2 :(得分:0)
您似乎建议您根据具体情况添加不同的处理程序:
if(that)
obj.event += HandleThat;
else
obj.event += HandleSomethingElse;
这应该有用,但你也可以在一个处理程序中完成:
obj.event += HandleAll;
void HandleAll(object sender, EventArgs arg) {
if(that)
HandleThat();
else
HandleSomethingElse();
}
编辑:好的,你编辑的问题确实意味着别的东西。
第一个明显的问题是您添加OnClickDelete
作为处理程序,并显示OnClickCard
的实现,在您的示例中不会调用它。如果是拼写错误,那么您只需要根据需要实现处理程序方法。究竟什么部分不起作用?