5

Ich möchte benutzerdefinierte Event-Handler zu Standard-Framework-Elementen hinzufügen, die DependencyProperties verwenden.Erstellen von Abhängigkeitseigenschaften zum Festlegen von benutzerdefinierten Event-Handlern in XAML

Etwas wie folgt aus:

<Border custom:MyProps.HandleMyEvent="someHandler">...</Border> 

Hier ist der Code hinter für die Steuerung, die das Border-Element enthält:

public class MyPage : Page{ 
    public void someHandler(object sender, EventArgs e){ 
     //do something 
    } 
} 

Hier ist grobes Beispiel, wie ich die Klasse vorstellen, die definiert Eigentum:

public class MyProps{ 
    public event EventHandler MyInternalHandler; 
    public static readonly DependencyProperty HandleMyEventProperty = ... 
    public void SetHandleMyEvent(object sender, EventHandler e){ 
     MyInternalHandler += e; 
    } 
} 

Das Problem ist, dass ich nicht weiß/habe keine gefunden Hinweise zur Kombination von DependencyProperties mit Ereignissen/Delegaten und EventHandlers.

Haben Sie eine Ahnung?

+0

Können wir einen Hinweis auf das Problem erhalten, für das diese Lösung gedacht ist? Wenn Sie Ereignisse zu Standard-Framework-Elementen hinzufügen möchten, wählen Sie einfach Unterklasse oder verwenden Sie Verhalten. –

Antwort

5

Ich gehe davon aus, dass dies nichts mit WPF zu tun hat, das ist eine Silverlight-Frage.

Als Erstes können Sie nicht einfach ein Event zu einem vorhandenen Steuerelement hinzufügen. Nach allem, was Sie hinzugefügt Properties hinzufügen, während Ereignisse anders behandelt werden, sind sie keine Eigenschaften.

Sie müssen einen neuen Typ erstellen, der über dieses Ereignis verfügt, und dann eine angefügte Eigenschaft dieses Typs erstellen.

Hier ist ein Grundtyp ist, der einfach ein Ereignis hat: -

public class MyEventer 
{ 
    public event EventHandler MyEvent; 

    // What would call this?? 
    protected void OnMyEvent(EventArgs e) 
    { 
     if (MyEvent != null) 
     MyEvent(this, e); 
    } 
} 

Nun erstellen wir eine angeschlossene Eigenschaft, die MyEventer als Eigenschaft hat, ziehe ich diese in einem gesonderten statischen Klasse zu platzieren.

public static class MyProps 
{ 

    public static MyEventer GetEventer(DependencyObject obj) 
    { 
    return (MyEventer)obj.GetValue(EventerProperty); 
    } 

    public static void SetEventer(DependencyObject obj, MyEventer value) 
    { 
    obj.SetValue(EventerProperty , value); 
    } 

    public static readonly DependencyProperty EventerProperty = 
     DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null) 

    } 
} 

Jetzt legen Sie diese auf eine Kontrolle wie folgt aus: -

<Border ...> 
    <custom:MyProps.Eventer> 
     <custom:MyEventer MyEvent="someHandler" /> 
    </custom:MyProps.Eventer> 
</Border> 

Wenn Sie das Projekt kompilieren, bevor Sie dieses XAML Schreiben werden Sie feststellen, dass Visual Studio haben Sie die Möglichkeit bieten, dafür zu schaffen der Event-Handler im Code hinter Ihnen.

Natürlich bleibt noch eine wichtige Frage offen: Wie wollten Sie das Ereignis auslösen?

+0

Das Ereignis wird durch den Rahmen ausgelöst, den ich schreibe. Und wie Sie richtig demonstrieren, brauchte ich eine OnMyEvent-Funktion für das einfache Auslösen der benutzerdefinierten Handler. Jetzt kann der Benutzer einen benutzerdefinierten Handler definieren oder einen neuen generieren, indem er die Tab-Taste in XAML verwendet. Sehr schön, auch wenn ich eine direkte DependencyProperty ohne das Extra ..> ..> bevorzugt hätte. wäre sehr schön zu verwenden. Wie auch immer, danke für Ihre wertvolle Eingabe! :) – Juve

+0

Ziemlich schlechte Namenskonvention Compliance. –

Verwandte Themen