Динамическое добавление обработчиков событий в WPF - PullRequest
3 голосов
/ 05 октября 2011

Мне нужна помощь с приложением, которое я создаю. У меня есть XML-файл, который читается в приложении. Этот XML имеет следующую структуру:

 `<Tabs>
  <Tab>
    <Search name="ListSearch" Title="SearchHeader">
      <Label Name="lblSchema"></Label>
      <ComboBox Name="comboxSchema" Visibility="Visible" IsEnabled="True" ItemSource="{Binding AvailableSchema}" SelectedValue="{Binding SelectedSchema}" />
      <ComboBox Name="comboxList" Visibility="Visible" IsEnabled="True" ItemSource="{Binding AvailableList}" SelectedValue="{Binding SelectedList}" />
      <Label Name="lblCriteria"></Label>
      <ComboBox Name="comboxFields" Visibility="Visible" IsEnabled="True" ItemSource="{Binding AvailableFields}" SelectedValue="{Binding SelectedField}" />
      <ComboBox Name="comboxOperator" Visibility="Visible" IsEnabled="True" ItemSource="{Binding Operations}" SelectedValue="{Binding SelectedOperator}" />
      <TextBox Name="txtBoxInputValue" Visibility="Visible" IsEnabled="True" Text="{Binding InputValue}" />
      <CustomControl type="DatePicker"></CustomControl>
      <Button Name="btnAddQueryLine" Content="{Binding TextOnAddQueryButton}" Command="{Binding CamlAddQueryLine}" Action="Publish"></Button>
      <Button Name="btnPasteQueryLine" Content="{Binding TextOnPasteQueryButton}" Command="{Binding CamlPasteQueryLine}" Action="Preview"></Button>
      <Button Name="btnRemoveQueryLine" Content="{Binding TextOnRemoveQueryButton}" Command="{Binding CamlRemoveQueryLine}" Action="UnPublish"></Button>
      <Button Name="btnClearQuery" Content="{Binding TextOnClearQueryButton}" Command="{Binding CamlClearQuery}" Action="UnPreview"></Button>
      <Button Name="btnCamlSearch" Content="{Binding TextOnSearchQueryButton}" Command="{Binding CamlSearch}" Action="Meh"></Button>
      <Button Name="btnCloseSearch" Content="{Binding TextOnCloseQueryButton}" Command="{Binding CloseSearch}" Action="NewMeh"></Button>
    </Search>
  </Tab>

  </Tabs>` 

Итак, я прочитал в xml и использую такие методы, чтобы добавить кнопки и т. Д. На ленту:

private void AddButtonToGroup(string header,RibbonGroup group,string command,string action)
    {
         RibbonButton button = new RibbonButton();
         button.Label = header;
         button.Name = action;

         button.Click += new RoutedEventHandler(button_Click);
         group.Items.Add(button);
    }

со следующим обработчиком событий:

void button_Click(object sender, RoutedEventArgs e)
    {
        Button clicked = (Button)sender;

        MessageBox.Show("Button Clicked!");
        MessageBox.Show("Performing Action:" + clicked.Name);

    }.

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

Ответы [ 2 ]

6 голосов
/ 05 октября 2011

Вы можете создать метод, который возвращает Action<object, RoutedEventArgs>:

private Action<object, RoutedEventArgs> MakeButtonClickHandler()
{
   return (object sender, RoutedEventArgs e) =>
      {
         // Put your code here, it will be called when
         // the button is clicked
      };
}

Так что MakeButtonClickHandler возвращает новую анонимную функцию каждый раз, когда она вызывается.Затем присвойте его следующим образом:

button.Click += new RoutedEventHandler(MakeButtonClickHandler());

Еще один способ выполнить то же самое - сделать это встроенным, например, так:

button.Click += (object sender, RoutedEventArgs e) =>
    {
        // Put your code here
    };

Для получения дополнительной информации взгляните на анонимные функции в MSDN .

2 голосов
/ 06 октября 2011

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

Например, XML будет:

<Button Content="TextOnAddQueryButton" Command="CamlAddQueryLine"></Button>

В коде вы бы назначили обработчик событий следующим образом:

private void AddButtonToGroup(string header,RibbonGroup group,string command,string action)
{
     RibbonButton button = new RibbonButton();
     button.Tag = command;
     //...
}

И обработчик для кнопки будет:

void button_Click(object sender, RoutedEventArgs e)
{
    Button clicked = (Button)sender;

    switch (clicked.Tag)
    {
        case "CamlAddQueryLine":
            // Call action for CamlAddQueryLine
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...