WedX - журнал о программировании и компьютерных науках

Событие нажатия кнопки в цикле С# WPF

У меня есть пара кнопок, которые я помещаю в wrapPanel в цикле:

        for (int i = 0; i < wrapWidthItems; i++)
        {
            for (int j = 0; j < wrapHeightItems; j++)
            {
                Button bnt = new Button();
                bnt.Width = 50;
                bnt.Height = 50;
                bnt.Content = "Button" + i + j;
                bnt.Name = "Button" + i + j;
bnt.Click += method here ?
                wrapPanelCategoryButtons.Children.Add(bnt);
            }
        }

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

private void buttonClicked(Button b)

где плохо отправить нажатую кнопку, проверить тип, имя или идентификатор этого, а затем что-то сделать. Это возможно?

27.07.2012

Ответы:


1

Добавьте это в свой цикл:

bnt.Click += (source, e) =>
{
    //type the method's code here, using bnt to reference the button 
};

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

27.07.2012
  • Я настоятельно рекомендую не использовать анонимные методы для обработчиков событий, если вы не храните где-то именованную ссылку на метод. В противном случае у вас нет способа удалить событие (кроме использования отражения для удаления всех обработчиков события). 27.07.2012
  • @rossisdead Со всем уважением не согласен; удаление события, по моему опыту, является очень редким требованием, и в редких случаях, когда вам действительно нужно его удалить, вы всегда можете изменить логическое значение, чтобы просто остановить/не выполнить цикл. Я не вижу логики отказываться от огромных преимуществ анонимных методов ради редкого требования их удаления, которое в любом случае можно выполнить с помощью альтернативных средств. 27.07.2012
  • @Daniel: я со всем уважением не соглашусь в ответ :) лол. Я согласен, что это не проблема, когда он используется в сценарии, где нет необходимости удалять прослушиватель событий. Но я думаю, что в сценарии с лучшими практиками вы всегда должны делать возможной очистку обработчиков событий, чтобы предотвратить утечку памяти (не такая большая проблема с WPF, если все события управления используют слабые обработчики). WPF также может немного потреблять память/производительность, поэтому использование одной ссылки на обработчик для всех кнопок также потенциально может быть лучше, чем создание нового обработчика для каждой кнопки. 28.07.2012
  • Еще одно замечание: если вы когда-либо использовали элементы управления диаграммами WPF Toolkit, они свободно используют анонимные функции для обработчиков событий, но при этом ужасно теряют память из-за неправильной очистки:/ 28.07.2012

  • 2

    Все методы, которые вы подключаете к событию, имеют аргумент sender, это объект, вызвавший событие. Итак, в вашем случае отправитель объекта Button, который был нажат. Вы можете просто бросить это так:

    void button_Click(Object sender, EventArgs e)
    {
        Button buttonThatWasClicked = (Button)sender;
        // your code here e.g. call your method buttonClicked(buttonThatWasClicked);
    }
    
    27.07.2012

    3

    Еще раз спасибо за оба ответа - оба работают. Есть полный код, возможно, кому-то это может понадобиться в будущем.

        for (int i = 0; i < wrapWidthItems; i++)
        {
            for (int j = 0; j < wrapHeightItems; j++)
            {
                Button bnt = new Button();
                bnt.Width = 50;
                bnt.Height = 50;
                bnt.Content = "Button" + i + j;
                bnt.Name = "Button" + i + j;
                bnt.Click += new RoutedEventHandler(bnt_Click);
               /* bnt.Click += (source, e) =>
                {
                    MessageBox.Show("Button pressed" + bnt.Name);
                };*/
                wrapPanelCategoryButtons.Children.Add(bnt);
            }
        }
    
    }
    
    void bnt_Click(object sender, RoutedEventArgs e)
    {
    
        Button buttonThatWasClicked = (Button)sender;
        MessageBox.Show("Button pressed " + buttonThatWasClicked.Name);
    
    }
    

    Кстати, я хотел бы знать, возможно ли (используя wrapPanel) переместить кнопки в другое место? Я имею в виду, когда я нажму и перетащу кнопку, смогу ли я сделать это в обертке?

    27.07.2012
  • Наверняка кому-то это сегодня нужно, я рад этому 27.05.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]