Можно ли динамически добавлять события в кнопки в XAML? - PullRequest
4 голосов
/ 20 апреля 2011

Я новичок в WPF / XAML, поэтому, пожалуйста, ответьте на вопрос noob.

Я разработал панель управления, которая в конечном итоге будет функционировать в качестве бэкэнда для моего сайта, и только что закончил раскладку всех кнопок на вкладках с помощью элемента TabControl. (это разработано с использованием форм «Window» Visual Studio.

У меня вопрос: возможно ли создать в файле xaml.cs функцию, которая будет динамически обрабатывать определенное событие для всех моих элементов кнопки? например ...

У меня есть 30+ кнопок, и я не хочу 30 разных Click = "btnCustomers_click" + их соответствующие функции в коде c #. Я хочу сказать одну функцию, которая позволит мне нажать любую кнопку, а затем открыть новое окно в зависимости от того, какая кнопка была выбрана.

Приведенный ниже код является моим текущим дизайном, однако для 30+ кнопок их будет много, и это будет грязно, поэтому я хочу иметь одну функцию, управляющую тем, какое окно открывается в зависимости от того, какая кнопка нажата.

        private void btnMerchants_click(object sender, RoutedEventArgs e)
    {
        var newWindow = new frmMerchants();
        newWindow.Show();
    }

Заранее спасибо за любые советы! :)

Ответы [ 3 ]

5 голосов
/ 20 апреля 2011

Вы можете использовать стиль для этого:

<Style TargetType="{x:Type Button}">
    <EventSetter Event="Click" Handler="btnMerchants_click"/>
</Style>

Если вы установите это в ресурсах где-то без x:Key, это будет применяться ко всем кнопкам.


например. если у вас есть Сетка, и вы хотите, чтобы определенный стиль применялся ко всем кнопкам в ней, вы бы определили ее следующим образом:

<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type Button}">
            <EventSetter Event="Click" Handler="Button_Click"/>
        </Style>
    </Grid.Resources>
    <Grid.Children>
        <!-- Buttons and stuff -->
    </Grid.Children>
</Grid>

Если вы просто хотите применить его к некоторым кнопкам, установите x:Key и укажите стиль:

<Grid>
    <Grid.Resources>
        <Style x:Key="AttachClickHandlerStyle" TargetType="{x:Type Button}">
            <EventSetter Event="Click" Handler="Button_Click"/>
        </Style>
    </Grid.Resources>
    <Grid.Children>
        <Button Content="Click me!" Style="{StaticResource AttachClickHandlerStyle}"/>
        <Button Content="Click me, too!" Style="{StaticResource AttachClickHandlerStyle}"/>
        <Button Content="Something different." Click="SomeOtherButton_Click"/>
    </Grid.Children>
</Grid>

Как правило, вы должны рефакторировать любые атрибуты, которые встречаются более одного раза, в стиле, чтобы избежать дублирования кода.

Кроме того, поскольку вы новичок, могут представлять интерес следующие статьи:

Стиль и шаблоны
Обзор ресурсов

3 голосов
/ 20 апреля 2011

Вы можете использовать перенаправленные события в родительском контейнере.
Пример:

<Grid Button.Click="GeneralHandler">
 <!-- Some stuff -->
</Grid>

В коде позади:

public void GeneralHandler(object sender, RoutedEventArgs e)
{
 Button b = e.OriginalSource as Button;
 //<-- Do something
}

Подробнее об этом можно прочитать на MSDN .

1 голос
/ 20 апреля 2011

Просто назначьте одинаковый обработчик Click = "btnCustomers_click" (с общим именем функции) для всех кнопок.Затем в функции откройте правильное окно на основе имени отправителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...