bagaimana cara menangani acara khusus saya di style-›eventsetter?

Saya telah membuat pengendali acara khusus di kontrol pengguna saya:

public partial class FooControl
{
   public event RoutedEventHandler AddFoo;

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

ketika saya ingin menangani acara seperti ini, semuanya berfungsi dengan baik:

<controls:FooControl AddFoo="FooControl_OnAddFoo"/>

Saya ingin melakukannya seperti itu tetapi kemudian ada sesuatu yang mogok dan saya tidak tahu mengapa.

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

Informasi lebih lanjut: editor menggarisbawahi AddFoo di EventSetter dan berkata

  • acara "AddFoo" bukan acara yang dialihkan
  • bidang deskriptor acara yang diarahkan "AddFooEvent" tidak ada
  • memunculkan pengecualian: Pengecualian muncul: 'System.Windows.Markup.XamlParseException' di PresentationFramework.dll
  • pengecualian dalam mengatakan nilai tidak boleh nol

EDIT:

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 sumber
comment
EventSetter hanya mendukung acara yang dirutekan. Acara Anda adalah acara CLR biasa. Anda dapat mengonversi acara AddFoo menjadi acara yang dirutekan.   -  person dymanoid    schedule 11.01.2019
comment
terima kasih atas tanggapan cepatnya tetapi bisakah Anda memberi tahu saya cara mengonversinya dan mengapa AddFoo saya bukan acara yang dirutekan?   -  person Rich    schedule 11.01.2019
comment
Baca di sini cara menentukan acara yang dirutekan khusus.   -  person dymanoid    schedule 11.01.2019
comment
sudah membacanya dan mencobanya seperti di atas di edit. Ini masih tidak berfungsi... apakah Anda melihat ada kesalahan?   -  person Rich    schedule 11.01.2019


Jawaban (1)


Acara Anda harus berupa acara yang diarahkan.

Menurut kode Anda, pendaftaran acara yang diarahkan salah.

Ini yang benar:

// '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); }
}

Harap perhatikan nama acaranya. Jangan bingung dengan properti ID acara. Ini penting.

person dymanoid    schedule 11.01.2019
comment
oh oke jadi saya mendaftarkan handlernya, bukan acaranya sendiri? tapi sekarang berhasil... terima kasih banyak - person Rich; 11.01.2019
comment
Tidak, Anda tidak mendaftarkan acara apa pun. Kode registrasi Anda salah. Anda mendapatkan pengecualian karena WPF tidak dapat menemukan acara yang dirutekan dengan nama yang Anda tentukan. - person dymanoid; 11.01.2019
comment
Ya, saya mendapatkannya dengan kode registrasi saya tetapi RegisterRoutedEvent ("Add"... sedang mendaftarkan nama acara ini bukan? - person Rich; 11.01.2019
comment
Ya itu betul. Ini adalah nama acaranya. Itu harus sama dengan acara CLR (yang memiliki pengakses add dan remove). - person dymanoid; 11.01.2019