none
feststellen ob ein Event abonniert wird RRS feed

  • 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!

    Icon für UWP

    Mittwoch, 24. Mai 2017 23:15

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
    Samstag, 27. Mai 2017 13:35

Alle Antworten

  • Hallo Thomas,

    das sieht mir nach WPF aus und das ist nicht mein Gebiet.
    Schau doch ob das hier trifft: https://stackoverflow.com/questions/2697247/how-to-determine-if-an-event-is-already-subscribed

    Grüße Alexander

    Donnerstag, 25. Mai 2017 07:57
  • 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!

    Icon für UWP

    Donnerstag, 25. Mai 2017 16:36
  • 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
    Samstag, 27. Mai 2017 13:35
  • 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!

    Icon für UWP

    Samstag, 27. Mai 2017 15:20