none
Как в коде создать содержание обработчика Click RRS feed

  • Общие обсуждения

  • WPF C#

    Подскажите пожалуйста

    Раньше я всегда подключал обработчик так:

    Button btn = new Button();
    btn.Name = "btn1";
    btn.Click += btn1_Click;
    
    private void btn1_Click(object sender, RoutedEventArgs e)
    {
    
    }

    Всё работает.

    Теперь встала задача не просто подключить заранее созданный обработчик нажатия кнопки, но и "утолкать" в обработчик саму команду. В моём случае при нажатии кнопки будет выполняться делегат(но это не важно, для примера можно просто MessageBox запустить)

    А вот как это сделать не могу понять.

    тут тоже подключается я так понял готовый обработчик.

    Нашёл код для кнопок в панели но также DoSomething я так понимаю уже готовый обработчик

    pnlButtons.AddHandler(Button.Click, new RoutedEventHandler(DoSomething));
     

    Это реализуемо?

    16 декабря 2015 г. 18:27

Все ответы

  • Добрый день.

    Не очень понятно, что вы хотите сделать, но может быть вот этот пример вам поможет (подписывает произвольный делегат типа Action на событие Click переданной кнопки):

    public void ButtonSubscriber(Button button, Action action)
    {
        if (button != null && action != null)
        {
            button.Click += (sender, e) => action();
        }
    }

    Если нет, то попробуйте переформулировать что вам нужно.

    17 декабря 2015 г. 7:21
    Отвечающий
  • У меня главное окно MainWindows в нём Grid

    Есть >100 UserControl каждый со своим функционалом и уникальным номером в Tag. UserControl загружаются в Grid Основного окна MainWindow

    А управление функционалом в этих UserControl осуществляется кнопками из главного окна.

    Как работало:

    Есть 10 кнопок в XAML у MainWindow у каждого свой обработчик Click

    В зависимости от загруженного UserControl я читаю его Tag и в коде определяю видимость нужных кнопок а также в зависимости от Tag запуск нужных делегатов, запускаю тот делегат который соответствует загруженному UserControl

    Например так для одной кнопки (т.к. весь код по определению видимости кнопок в нужный момент > 2000 строк :))

    void BTNMenuDownSix_Click(object sender, RoutedEventArgs e) { switch (StaticVariables._typeChange) { #region 216 Документация case 216: { UCDocumentation.CallBackText.callbackEventHandler(); } break; #endregion #region 100 окно настроек case 100: { StaticVariables._typeChange = 101; UCData _ucrd = new UCData(); LoadUserControl(_ucrd); MenuButtonMetod(); } break; #endregion default: break; }

    void MenuButtonMetod() {

    switch(StaticVariables._typeChange)

    {

    #region 216 Документация case 216: { BTNMenuDownOne.Visibility = Visibility.Visible; BTNMenuDownTwo.Visibility = Visibility.Visible; BTNMenuDownThen.Visibility = Visibility.Visible; } break; #endregion #region 100 Окно настроек case 100: { BTNMenuDownSix.Visibility = Visibility.Visible; } break; #endregion #region 101 Заполнение людей case 101: { BTNMenuDownOne.Visibility = Visibility.Visible; BTNMenuDownTwo.Visibility = Visibility.Visible; } break; #endregion }



    Когда UserControl было даже пара десятков ещё справлялся с тем, где кто за что отвечает

    Сейчас решил всё переделать и все кнопки создавать динамически, но проблема осталась в чём, в запуске того делегата (иногда это не делегат, а просто вызов другого UserControl), который должен запуститься в данный момент.

    т.е. когда загружен UserControl1 Name="UC1"; То в первой кнопке по Click должен запуститься делегат запускающий метод в UserControl1,

    А когда Будет загружен UserControl145 Name"UC145" ; То в первой кнопке по Click должен запуститься делегат запускающий метод в UserControl145,

    Названия делегатов и методов в каждом UserControl разные и их количество также разное. Поэтому и количество кнопок управления в главном окне тоже разное


    • Изменено DevingAs 17 декабря 2015 г. 8:44
    17 декабря 2015 г. 8:43
  • Кратко результат, что хочу написать кодом XAML нет вообще:

    Было:

    Button btn = new Button();
    btn.Name = "btn1";
    btn.Click += btn1_Click;
    
    private void btn1_Click(object sender, RoutedEventArgs e)
    {
    MessageBox.Show("Проверка");
    }


    Что хочу добиться, чтобы вот этот код 

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
    MessageBox.Show("Проверка");
    }

    создавался при создании экземпляра кнопки примерно как то так:

    Button btn = new Button();
    btn.Name = "btn1";
    btn.Click += btn1_Click(MessageBox.Show("Проверка"));
    
    или
    Button btn = new Button();
    btn.Name = "btn1";
    btn.Click += btn1_Click(GRDName.Children.Add(new UserControl1)));

    Т.е. при создании самой кнопки сразу прописывать и метод её выполнения.

    17 декабря 2015 г. 12:24