none
Обработка блока кнопок WPF RRS feed

  • Вопрос

  • Имеется блок кнопок на форме WPF. Предположим, например что их 20 штук. Как технически грамотно обрабатывать нажатия на эти кнопки, если они выполняют схожие задачи?

    2 февраля 2015 г. 5:57

Ответы

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

    Если вы используете подписывание на события, то в методе есть параметр sender. Приводите его к типу Button и анализируете Content или Tag, в которые записываете инфолрмацию достаточную для идентификации кнопок.

    Если у вас паттерн MVVM, то при Binding-е команд, вы можете передать в качестве параметра некоторое значение, которое будет анализироваться методом и на его основе будут выполняться те или иные действия.

    Если не очень понятно, то напишите какой у вас вариант и я покажу пример на него.

    • Помечено в качестве ответа Vadim Pashaev 2 февраля 2015 г. 10:33
    2 февраля 2015 г. 6:23
    Отвечающий

Все ответы

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

    Если вы используете подписывание на события, то в методе есть параметр sender. Приводите его к типу Button и анализируете Content или Tag, в которые записываете инфолрмацию достаточную для идентификации кнопок.

    Если у вас паттерн MVVM, то при Binding-е команд, вы можете передать в качестве параметра некоторое значение, которое будет анализироваться методом и на его основе будут выполняться те или иные действия.

    Если не очень понятно, то напишите какой у вас вариант и я покажу пример на него.

    • Помечено в качестве ответа Vadim Pashaev 2 февраля 2015 г. 10:33
    2 февраля 2015 г. 6:23
    Отвечающий
  • Делаю так:

    <WrapPanel>
        <Button Tag="0xF1" Click="Button_Click" Width="30" Height="20" Margin="2">1</Button>
        <Button Tag="0xF2" Click="Button_Click" Width="30" Height="20" Margin="2">2</Button>
        <Button Tag="0xF3" Click="Button_Click" Width="30" Height="20" Margin="2">3</Button>
        <Button Tag="0xF4" Click="Button_Click" Width="30" Height="20" Margin="2">4</Button>
        <Button Tag="0xF5" Click="Button_Click" Width="30" Height="20" Margin="2">5</Button>
        <Button Tag="0xF4" Click="Button_Click" Width="30" Height="20" Margin="2">6</Button>
        <Button Tag="0xF5" Click="Button_Click" Width="30" Height="20" Margin="2">7</Button>
        <Button Tag="0xF6" Click="Button_Click" Width="30" Height="20" Margin="2">8</Button>
        <Button Tag="0xF7" Click="Button_Click" Width="30" Height="20" Margin="2">9</Button>
        <Button Tag="0xF8" Click="Button_Click" Width="30" Height="20" Margin="2">10</Button>
        <Button Tag="0xF9" Click="Button_Click" Width="30" Height="20" Margin="2">11</Button>
        <Button Tag="0xFA" Click="Button_Click" Width="30" Height="20" Margin="2">12</Button>
        <Button Tag="0xFB" Click="Button_Click" Width="30" Height="20" Margin="2">13</Button>
        <Button Tag="0xFC" Click="Button_Click" Width="30" Height="20" Margin="2">14</Button>
        <Button Tag="0xFD" Click="Button_Click" Width="30" Height="20" Margin="2">15</Button>
        <Button Tag="0xFE" Click="Button_Click" Width="30" Height="20" Margin="2">16</Button>
        <Button Tag="0xE1" Click="Button_Click" Width="30" Height="20" Margin="2">17</Button>
        <Button Tag="0xE2" Click="Button_Click" Width="30" Height="20" Margin="2">18</Button>
        <Button Tag="0xE3" Click="Button_Click" Width="30" Height="20" Margin="2">19</Button>
        <Button Tag="0xE4" Click="Button_Click" Width="30" Height="20" Margin="2">20</Button>
    </WrapPanel>

    Собственно, обработчик:

    void Button_Click(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        switch (Convert.ToUInt32(btn.Tag.ToString(), 16))
        {
            case 0xF4:
                MessageBox.Show("Функция 1""Инфо");
                break;
            case 0xF3:
                MessageBox.Show("Функция 2""Инфо");
                break;
            default:
                MessageBox.Show("" + btn.Tag, "Инфо");
                return;
        }
    }

    Не знаю насколько это практично с точки зрения WPF. К сожалению не знаю как это реализовать в MVVM?


    2 февраля 2015 г. 10:05
  • Ну да, неплохой вариант. Или у вас с ним какие то проблемы?
    2 февраля 2015 г. 10:08
    Отвечающий
  • Хорошо. Допустим кроме кнопок у меня используется еще несколько элементов управления. Среди них TextBox,  CheckBox и несколько ComboBox-ов. Тогда как грамотно организовать с них сбор данных?
    2 февраля 2015 г. 10:20
  • Перейти на паттерн MVVM, и используя Binding привязывать эти элементы к коллекциям. Работать будите только с объектными данными не задумываясь, как они там вводятся бедным пользователем.

    Ну а так, если абстрактно и без MVVM, то анализируете визуальное дерево, ищите в нем компоненты заданных типов с заданными свойствами и пытаетесь перенести из них данных в объектную модель своей программы.

    P.s. Один топик - один вопрос. Так проще искать по форуму. Если вы свою проблему решили, то

    пометьте ответ или ответы которые помогли вам с поиском решения и создайте новый топик с новым вопросом. Только больше конкретики укажите по стоящей перед вами проблеме.


    2 февраля 2015 г. 10:28
    Отвечающий