ฉันจะจัดการเหตุการณ์ที่กำหนดเองใน style->evensetter ได้อย่างไร

ฉันได้สร้างตัวจัดการเหตุการณ์แบบกำหนดเองใน usercontrol ของฉัน:

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