Как мне обрабатывать события нажатия на нескольких похожих кнопках в WPF? - PullRequest
2 голосов
/ 11 июня 2010

Я новичок в C # и пытаюсь реализовать числовую панель в WPF. Он состоит из 10 одинаковых кнопок:

<Button Content="0" Name="button0" Click="anyButtonClicked" />
<Button Content="1" Name="button1" Click="anyButtonClicked" />
<Button Content="2" Name="button2" Click="anyButtonClicked" />
...
<Button Content="9" Name="button9" Click="anyButtonClicked" />

Как лучше всего обрабатывать все эти кнопки? Должен ли я создать функцию в коде для каждой из них (которая будет в основном скучной и повторяющейся) или создать функцию для обработки нажатия любой кнопки?

Во втором случае, как определить, какая кнопка была нажата? К какому свойству объекта отправителя мне нужно получить доступ?

Ответы [ 3 ]

5 голосов
/ 11 июня 2010

Если вы хотите использовать код позади, тогда вы можете подключить его к одному обработчику событий, затем вы можете привести отправителя к Button (или FrameworkElement) и проверить его Свойство Name .

Расширяя ответ Гоблина ниже; если вы хотите придерживаться кода и событий, вы можете определить событие на родительской панели:

<StackPanel Button.Click="anyButtonClicked">
    <Button Content="0" Name="button0"/>
    <Button Content="1" Name="button1"/>
    <Button Content="2" Name="button2"/>
    ...
    <Button Content="9" Name="button9"/>
</StackPanel>

Затем используйте e.OriginalSource, приведенный как Button или FrameworElement, для получения имени.

private void anyButtonClicked(object sender, RoutedEventArgs e)
{
    var source = e.OriginalSource as FrameworkElement;

    if (source == null)
        return;

    MessageBox.Show(source.Name);
}

В качестве альтернативы вы можете воспользоваться подходом MVVM, иметь одну команду, к которой привязаны все ваши кнопки, и передать CommandParameter для их дифференциации.

1 голос
/ 11 июня 2010

Вам действительно нужно использовать командный подход, потому что он может понадобиться и для нажатия клавиш.

1 голос
/ 11 июня 2010

Вы обрабатываете событие Button.Click в элементе управления Parent:

<StackPanel Button.Click="anyButtonClicked">
    <Button Content="0" Name="button0"/>
    <Button Content="1" Name="button1"/>
    <Button Content="2" Name="button2"/>
    ...
    <Button Content="9" Name="button9"/>
</StackPanel>

Затем в обработчике событий - вы можете проверить e.OriginalSource для нажатой кнопки.

РЕДАКТИРОВАТЬ: Как дляВаш вопрос о том, как с ним справиться - вы можете использовать свойство Content нажатой кнопки, чтобы выяснить ключ, а затем использовать его для выполнения своей логики.

...