5

Voglio aggiungere gestori di eventi personalizzati agli elementi di framework predefiniti utilizzando DependencyProperties.Crea proprietà dipendenze per l'impostazione di EventHandlers personalizzati in XAML

Qualcosa di simile a quanto segue:

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

Ecco il codice dietro per il controllo che contiene l'elemento di confine:

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

Ecco ruvido di come immagino la classe che definisce il proprietà:

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

Il problema è che non so/non ho trovato alcun suggerisce come combinare DependencyProperties con eventi/delegati e EventHandlers.

Avete un indizio?

+0

Possiamo avere un suggerimento sul problema per cui questa soluzione sarebbe? Se stai cercando di aggiungere eventi a elementi di framework predefiniti, basta sottoclasse o usa Behaviors. –

risposta

5

Suppongo che questo non abbia nulla a che fare con WPF, questa è una domanda di Silverlight.

Prima di tutto non è sufficiente aggiungere un Event a un controllo esistente. Dopotutto aggiungi l'allegato Properties mentre gli eventi sono gestiti in modo diverso, non sono proprietà.

È necessario creare un nuovo tipo con questo evento, quindi creare una proprietà associata di questo tipo.

Ecco un tipo di base che ha semplicemente un evento: -

public class MyEventer 
{ 
    public event EventHandler MyEvent; 

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

Ora creiamo una proprietà associata che ha MyEventer come sua proprietà, preferisco mettere questi in una classe statica separata.

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) 

    } 
} 

Ora si collega ad un controllo in questo modo: -

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

Se si compila il progetto prima di scrivere questo XAML noterete che Visual Studio vi offrirà la possibilità per esso di creare il gestore di eventi nel codice dietro per te.

Ovviamente questo lascia ancora una domanda significativa: come intendevi far scattare l'evento?

+0

L'evento è licenziato dal framework che sto scrivendo. E come hai dimostrato correttamente avevo bisogno di una funzione OnMyEvent per innescare facilmente i gestori definiti dall'utente. Ora l'utente può definire il gestore personalizzato o generarne uno nuovo utilizzando la chiave di accesso in XAML. Molto bello, anche se avessi preferito una DependencyProperty diretta senza il ..> ..>. sarebbe molto bello da usare. Comunque, grazie per il vostro prezioso contributo! :) – Juve

+0

Conformità convenzione di naming piuttosto male. –

Problemi correlati