1

我目前正在做一个小项目,需要在某些上下文菜单项中进行一些重复。菜单从右键单击上下文菜单开始,并以不同的颜色分支出来,然后是对象。根据所选的颜色和对象,表单上的对象会发生变化。这很混乱,但不幸的是,我找不到更简单的方法来完成这项工作(谢天谢地,它只需要为一个菜单完成)。

我已经将颜色创建为菜单项并添加了它们,但每种颜色都重复相同的 8 个对象:

foreach (MenuItem i in colors.MenuItems)
{
    MenuItem one = new MenuItem();
    one.Text = "One";
    MenuItem two = new MenuItem();
    two.Text = "Two";
    MenuItem three = new MenuItem();
    three.Text = "Three";
    MenuItem four = new MenuItem();
    four.Text = "Four";
    MenuItem five = new MenuItem();
    five.Text = "Five";
    MenuItem six = new MenuItem();
    six.Text = "Six";
    MenuItem seven = new MenuItem();
    seven.Text = "Seven";
    MenuItem eight = new MenuItem();
    eight.Text = "Eight";
    i.MenuItems.Add(one);
    i.MenuItems.Add(two);
    i.MenuItems.Add(three);
    i.MenuItems.Add(four);
    i.MenuItems.Add(five);
    i.MenuItems.Add(six);
    i.MenuItems.Add(seven);
    i.MenuItems.Add(eight);
}

首先,我认为在 foreach 循环中创建所有对象菜单项是低效的,所以我将它们移到它之前。当我这样做时,对象只被添加到最终颜色,而不是全部。这似乎很奇怪,如果有人能解释为什么会发生这种情况,我将不胜感激。

其次,计划是根据用户选择的菜单选项来更改被右键单击的对象。除了为每个单独的菜单项设置 Menu.Click 事件之外,还有更简单的方法来选择菜单项吗?

任何帮助将不胜感激。

在此先感谢,鲍勃

4

2 回答 2

0

首先,我认为在 foreach 循环中创建所有对象菜单项是低效的,所以我将它们移到它之前。当我这样做时,对象只被添加到最终颜色,而不是全部。这似乎很奇怪,如果有人能解释为什么会发生这种情况,我将不胜感激。

每个MenuItem只能是一个对象的子对象。该框架正在默默地使其成为最后一个被分配为其子级的事物的子级。

通过采用类似于 Alex Siepman 解决方案中的方法,可以从您的代码中删除很多重复。我添加了一个Click处理程序并进行了其他小的更改。

void Something()
{
    MyColoredObject o = //something
    var textValues = new[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"};

    foreach (MenuItem color in colors.MenuItems)
    {
        for (int i = 1; i <= 8; i++)
        {
            MenuItem newItem = new MenuItem();
            newItem.Text = textValues[i];
            newItem.Click += NumberClickHandler(o, color, i);
            color.MenuItems.Add(newItem);
        }
    }
}
EventHandler NumberClickHandler(MyColoredObject o, MenuItem color, int num)
{
    return (s, e) =>
    {
        // assign the color to o as identified by color and num
    };
}
于 2013-08-10T12:14:15.077 回答
0

我无法回答您的所有问题,因为我不清楚上下文,但至少代码可以更短:

var textvalues = new[] {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"};

foreach (MenuItem i in colors)
{
    var newItems = textvalues.Select(t => new MenuItem{Text = t});
    foreach (MenuItem newItem in newItems)
    {
        i.MenuItems.Add(newItem);
    }
}
于 2013-08-10T12:02:24.893 回答