Назначьте методы событиям с помощью массива C#

#c# #events #methods

#c# #Мероприятия #методы

Вопрос:

Я использую WPF C # VS.

Я должен создать что-то вокруг 100 кнопок, и каждая из них должна иметь свое собственное событие.Я также не хочу создавать их сам.

Например:

1. Кнопка Окрашивает все остальные кнопки в красный цвет. Кнопка 2. Открывает новое окно. 3. Кнопка показывает окно сообщения. … Каждый делает что-то другое!!

Итак, вопрос в том, как я могу хранить методы в массивах?

Это должно сработать примерно так:

 List<Button> buttons = new List<Button>();    //Contains all buttons
void fillButtonsList() {...}                  //Storing Buttons in list
Method[] methods = new Method[]               //Storing Methods in Arrays
{
    colorAll,
    openWindow,
    showMessageBox,
    ...
}
void ApplyEvents()                            //Assign Methods to Events
{
    for (int i = 0; i < methods.Length; i  )
    {
        buttons[i].Click  = methods[i];
    }
}
void colorAll() {...}                         //Methos get Executed when Event got Fired
void openWindow() {...}
void showMessageBox() {...}
...
 

Надеюсь, вы поняли мой вопрос: мой английский не очень хорош.

Комментарии:

1. использовать Action вместо Method ?

2. или, может EventHandler быть?

Ответ №1:

Я предлагаю что-то вроде этого:

 List<Button> buttons = new List<Button>();    //Contains all buttons
void fillButtonsList() {...}                  //Storing Buttons in list
Action[] methods = new Action[]               //Storing Methods in Arrays
{
    colorAll,
    openWindow,
    showMessageBox,
    ...
}
void ApplyEvents()                            
{
    for (int i = 0; i < methods.Length; i  )
    {
        buttons[i].Click  = (s, e) => methods[i].Invoke();
    }
}
void colorAll() {...}                         
void openWindow() {...}
void showMessageBox() {...}
 

Ответ №2:

Я решил это сам:

 ContextMenu cm1 = new ContextMenu();
(string, bool, ContextMenu, RoutedEventHandler)[] ContextMenuInfo = new (string, bool, ContextMenu, RoutedEventHandler)[]
{
    ("1", false, cm1, event1),
    ("2", false, cm1, event2),
    ("3", false, cm1, event3),
    ("4", false, cm1, event4),
    ("5", false, cm1, event5)
};
foreach ((string, bool, ContextMenu, RoutedEventHandler) item in ContextMenuInfo)
{
    MenuItem mi = MakeContextMenuMenuItem(item.Item1, item.Item2);
    mi.Click  = item.Item4;
    item.Item3.Items.Add(mi);
}
void event1() {...}
void event2() {...}
void event3() {...}
void event4() {...}
void event5() {...}

private MenuItem MakeContextMenuMenuItem(string text, bool bold = false)
{
    TextBlock tbb = new TextBlock();
    if (bold)
    {
        tbb.Inlines.Add(new Bold(new Run(text)));
    }
    else
    {
        tbb.Text = text;
    }
    MenuItem mi = new MenuItem();
    mi.Header = tbb;
    return mi;
}