Benutzer mit den meisten Antworten
feststellen ob ein Event abonniert wird

Frage
-
Hallo,
ich schreibe grade ein kleines Framework in dem es Controls und Events gibt. Wie z.B. das
public event Events.Handler.PointerRoutedEventHandler PointerEntered; protected virtual void OnPointerEntered(Events.EventArgs.PointerRoutedEventArgs e) { PointerEntered?.Invoke(this, e); } internal void PointerEnteredTrigger(Events.EventArgs.PointerRoutedEventArgs e) { OnPointerEntered(e); }
Bei Änderung der Position des Pointer, suche ich in einer List nach allen Controls zur Position, sortiere sie nach dem ZIndex und löse das Event aus. Sobald ein Control Handle true zurückgibt, höre ich damit auf. Gibt es eine Möglichkeit festzustellen ob das Control das Event überhaupt abonniert. Die zusätzlichen Abfrage würde wohl länger dauern als das durchlaufen der Liste, interessieren würde es mich trotzdem.
Leider finde ich dazu nichts, mir fehlen wohl die Begrifflichkeiten
Gruß, Thomas
Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
Antworten
-
Hallo Thomas,
wie man feststellt, ob ein Handler bereits registriert ist, habe ich mich auch schon gefragt (obwohl ich es noch nicht wirklich benötigte). Ich habe mir folgendes gebaut:
public class MyData2 : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public bool HasHandler(Action<object, PropertyChangedEventArgs> handler) { return PropertyChanged?.GetInvocationList().FirstOrDefault(del => del.Target == handler.Target && del.GetMethodInfo().Name == handler.GetMethodInfo().Name) != null; } public void NotifyPropertyChanged(string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
MyData2 Data; int Test = 0; public MainPage() { this.InitializeComponent(); Data = new MyData2(); if (!Data.HasHandler(Data_PropertyChanged)) Data.PropertyChanged += Data_PropertyChanged; Data.NotifyPropertyChanged("smth"); if (Data.HasHandler(Data_PropertyChanged)) Data.PropertyChanged -= Data_PropertyChanged; Data.NotifyPropertyChanged("smth"); } private void Data_PropertyChanged(object sender, PropertyChangedEventArgs e) { Test++; }
Wenn ich dich richtig verstanden habe, würde es in deinem Fall vermutlich genügen, nur das Delegate.Target abzufragen.
public bool IsEventAbboniert(Control control) { return PropertyChanged?.GetInvocationList().FirstOrDefault(del => del.Target == control) != null; }
Gruß
Heiko- Als Antwort markiert Thomas Wycichowski Samstag, 27. Mai 2017 15:20
Alle Antworten
-
Hallo Alexander,
nein es ist nicht WPF sondern ein eigenes cross Plattform Canvas Framework. Die Ähnlichkeit zu WPF/UWP ist aber gewünscht damit sich mögliche Entwickler schnell zurecht finden.
Dein Link ist durchaus interessant nur ist es die Sicht eines Entwicklers gegen das Framework der das Event nicht selbst geschrieben hat. Es steht zwar auch das man auf die internen Listen kein Zugriff hat aber ist das auch so?
Gruß, Thomas
Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!
-
Hallo Thomas,
wie man feststellt, ob ein Handler bereits registriert ist, habe ich mich auch schon gefragt (obwohl ich es noch nicht wirklich benötigte). Ich habe mir folgendes gebaut:
public class MyData2 : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public bool HasHandler(Action<object, PropertyChangedEventArgs> handler) { return PropertyChanged?.GetInvocationList().FirstOrDefault(del => del.Target == handler.Target && del.GetMethodInfo().Name == handler.GetMethodInfo().Name) != null; } public void NotifyPropertyChanged(string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
MyData2 Data; int Test = 0; public MainPage() { this.InitializeComponent(); Data = new MyData2(); if (!Data.HasHandler(Data_PropertyChanged)) Data.PropertyChanged += Data_PropertyChanged; Data.NotifyPropertyChanged("smth"); if (Data.HasHandler(Data_PropertyChanged)) Data.PropertyChanged -= Data_PropertyChanged; Data.NotifyPropertyChanged("smth"); } private void Data_PropertyChanged(object sender, PropertyChangedEventArgs e) { Test++; }
Wenn ich dich richtig verstanden habe, würde es in deinem Fall vermutlich genügen, nur das Delegate.Target abzufragen.
public bool IsEventAbboniert(Control control) { return PropertyChanged?.GetInvocationList().FirstOrDefault(del => del.Target == control) != null; }
Gruß
Heiko- Als Antwort markiert Thomas Wycichowski Samstag, 27. Mai 2017 15:20
-
Hallo Heiko,
sowas in der art habe ich gesucht. Danke
Gruß, Thomas
Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!