как я могу обработать свое пользовательское событие в style-eventsetter?

Я сделал собственный обработчик событий в своем пользовательском элементе управления:

public partial class FooControl
{
   public event RoutedEventHandler AddFoo;

   private void AddFoo_Click(object sender, RoutedEventArgs e)
   {
       if (AddFoo != null)
           AddFoo(this, new RoutedEventArgs());
   }
}

когда я хочу обработать такое событие, все работает нормально:

<controls:FooControl AddFoo="FooControl_OnAddFoo"/>

Я хотел сделать это так, но потом что-то вылетает, и я не знаю, почему.

<Style TargetType="controls:FooControl">
    <EventSetter Event="AddFoo" Handler="Event_AddFoo"/>
</Style>

Дополнительная информация: редактор подчеркивает AddFoo в EventSetter и говорит

  • событие "AddFoo" не является маршрутизируемым событием
  • Поле дескриптора маршрутизируемого события «AddFooEvent» отсутствует
  • выдает исключение: Исключение: «System.Windows.Markup.XamlParseException» в PresentationFramework.dll
  • внутреннее исключение говорит, что значение не должно быть нулевым

ИЗМЕНИТЬ:

public static readonly RoutedEvent AddEvent = 
                               EventManager.RegisterRoutedEvent
                               ("AddEvent", RoutingStrategy.Bubble, 
                               typeof(RoutedEventHandler), typeof(FooControl));
public event RoutedEventHandler AddFoo
{
    add { AddHandler(AddEvent, value); }
    remove { RemoveHandler(AddEvent, value); }
}

void RaiseAddEvent()
{
    RoutedEventArgs newEventArgs = new RoutedEventArgs(FooControl.AddEvent);
    RaiseEvent(newEventArgs);
}

private void AddFoo_Click(object sender, RoutedEventArgs e)
{
    RaiseAddEvent();
}

person Rich    schedule 11.01.2019    source источник
comment
EventSetter поддерживает только перенаправленные события. Ваше событие — это обычное событие CLR. Вы можете преобразовать ваше событие AddFoo в маршрутизируемое событие.   -  person dymanoid    schedule 11.01.2019
comment
спасибо за быстрый ответ, но не могли бы вы рассказать мне, как мне его преобразовать и почему мой AddFoo не является маршрутизируемым событием?   -  person Rich    schedule 11.01.2019
comment
Прочитайте здесь как определить пользовательское маршрутизируемое событие.   -  person dymanoid    schedule 11.01.2019
comment
уже прочитал это и попробовал, как указано выше, в редактировании. Это все еще не работает... вы видите ошибку?   -  person Rich    schedule 11.01.2019


Ответы (1)


Ваше событие должно быть перенаправленным.

Согласно вашему коду, регистрация маршрутизируемого события неверна.

Вот правильный:

// 'AddEvent' is the name of the property that holds the routed event ID 
public static readonly RoutedEvent AddEvent = EventManager.RegisterRoutedEvent
    ("Add", // the event name is 'Add'
    RoutingStrategy.Bubble, 
    typeof(RoutedEventHandler),
    typeof(FooControl));

// The event name is 'Add'
public event RoutedEventHandler Add
{
    add { AddHandler(AddEvent, value); }
    remove { RemoveHandler(AddEvent, value); }
}

Обратите внимание на название события. Не путайте его со свойством идентификатора события. Это важно.

person dymanoid    schedule 11.01.2019
comment
о, хорошо, я регистрирую обработчик, а не само событие? но теперь это работает... большое спасибо - person Rich; 11.01.2019
comment
Нет, вы не регистрируете какое-либо событие. Ваш регистрационный код неверен. Вы получаете исключения, потому что WPF не может найти перенаправленное событие с указанным вами именем. - person dymanoid; 11.01.2019
comment
Да, я понял это с моим регистрационным кодом, но RegisterRoutedEvent ("Add"... регистрирует название этого мероприятия, не так ли? - person Rich; 11.01.2019
comment
Да все верно. Это название события. Оно должно совпадать с событием CLR (с аксессорами add и remove). - person dymanoid; 11.01.2019