2010-11-01 3 views
1

J'ai posé une question précédente sur le bouillonnement d'événements dans .NET What's equivalent to javascript bubbling events in .NET?Comment implémenter ce nouveau gestionnaire d'événements système que je veux inventer en C# si ce n'est pas dans quelle langue?

qui n'existe pas comme en Javascript. Quelqu'un a dit que cela serait dû à des raisons de performance, mais je ne suis pas sûr parce que DOM n'a pas de problème de performance pourquoi Winform.

Mais disons que c'est vrai, alors je voudrais créer quelque chose d'intermédiaire entre un système de bulles systématique comme javascript et un système de bulles inexistant dans .NET.

Le but est toujours le couplage libre. C'est pourquoi je ne veux pas d'une référence explicite dans mon code comme utiliser l'expéditeur ou câbler l'appel de méthode avec une référence à un parent de base.

Ce que je voudrais, c'est juste utiliser un mot-clé comme "Forward".

Comment pourrais-je implémenter un tel système en C#? Si ce n'est pas possible en C#, quelles langues me le permettraient?

+3

Comme les événements routés dans WPF? –

+0

D'accord avec Albin Sunnanbo - événement bouillonnant dans WPF est exactement ce que vous décrivez –

+0

Je ne sais pas encore WPF mais je veux pour Winform. Je veux savoir s'il est possible de tordre le système pour le faire. – user310291

Répondre

1

Regardez comment les événements sont effectués dans WPF, y compris les événements routés. Il n'y a pas besoin d'un nouveau mot-clé, juste un ensemble de classes le chemin des événements de la manière que vous souhaitez. MFC a même fait ce genre de chose en C++ - sans surport de "événements" en C++ c'est soi-même.

+0

Je ne veux pas dans WPF, je veux dans Winform, est-ce possible? – user310291

+0

@ user310291, étant donné que WPF est écrit.net, vous devez être en mesure d'écrire la même chose dans .net avec Winforms –

+0

événements routés sont couplés à la structure de mise en page visuelle dans WPF, vous pouvez réutiliser certaines parties, mais doivent réécrire d'autres pour le faire fonctionner. Cela demande beaucoup de travail, je pense. –

1

Si vous voulez des événements routés comme dans WPF, je peux parier qu'il est plus facile de réécrire votre application dans WPF que d'écrire votre propre cadre d'événements. Si vous aimez aussi d'autres choses comme la liaison de données bidirectionnelle (jetez un oeil à MVVM) ou l'histoire de la personnalisation de la mise en page améliorée, vous devriez vraiment jeter un oeil à WPF.

Vous pouvez probablement également implémenter des événements routés dans WinForms. Vous "juste" besoin de mettre en œuvre les parties émettrices, consommatrices et bouillonnantes du cadre.

Je pense que votre principal problème avec l'implémentation de votre propre structure de gestion d'événements est que les contrôles existants ne savent pas comment émettre ou consommer vos événements. Vous n'avez aucun point d'ancrage existant dans la mise en page Winforms où vous pouvez attacher la consommation d'un événement.

1

Vous pouvez l'implémenter vous-même. Vous aurez besoin de votre propre classe EventManager.

public class EventManager 
{ 
    public void AddEvent(Control control,string eventName,Delegate handler); 
    public void RemoveEvent(Control control,string eventName,Delegate handler); 
} 

cette classe utilise alors un HashSet et les événements ControlAdded et ControlRemoved pour suivre tous les contrôles sur lesquels vous avez enregistré un événement et tout leur enfant. Et puis souscrit son propre helper-delegate pour l'événement registed sur tous les enfants du contrôle sur lequel vous avez enregistré l'événement. Ce délégué aide alors les événements enregistrés en utilisant les règles de bouillonnement que vous voulez.

+0

Bonne idée mais je ne veux pas que chaque application câline ce gestionnaire d'événements par lui-même, c'est pourquoi j'ai parlé d'accrocher ou de bouillonner des événements. C'est comme AOP mais beaucoup plus naturel. – user310291