0

我是 C# 和 WinForms 的新手。我有一些带有右键单击(上下文菜单)事件的对象。但是,根据上下文(例如,取决于用户是在向导屏幕还是主屏幕中),我想更改右键单击的功能。我用谷歌搜索了一下,发现我可以使用+=-=运算符,但我仍然无法实现我想要做的事情。例如,给定下面的代码,

有任何想法吗 ?

编辑:我希望OnClickCard在不同的地方表现不同。

示例代码:

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));
}
4

3 回答 3

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;

希望这可以帮助。

于 2013-04-11T12:06:22.853 回答
0

+=并且-=应该可以正常工作,但我建议您使用一种处理程序存储库,您可以在其中切换要使用的处理程序。这应该像策略模式一样工作,其中不同的向导步骤将是不同的策略。

如果您向我们展示一些代码并指出哪些代码部分无法正常工作,将会更容易为您提供帮助。

于 2013-04-11T11:57:24.320 回答
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在您的示例中不会调用的实现。如果是拼写错误,那么您只需要根据需要实现处理程序方法。究竟是哪一部分不工作?

于 2013-04-11T12:02:12.040 回答