Dans les exemples fournis d'hébergement du designer dans des applications, l'édition des propriétés se fait systématiquement par un contrôle PropertyGrid qui expose en brut de décoffrage les propriétés des objets déposés dans la vue en cours. C'est parfait pour une démonstration mais, à mon sens, un peu trop technique pour un utilisateur final. C'est pourquoi je me suis penché sur comment afficher des boites de dialogue personnalisées quand un utilisateur dépose une nouvelle activité sur le designer ou fait un double-click sur une activité existante (avec l’aide de Sergey Chub).  Ici, je vais parler de la gestion du double-click.

Interception du double-click dans vos activités

Si vous créer vos propres activités, la solution est assez triviale : une fois votre objet dérivant d’Activity créé, créez une nouvelle classe héritant de ActivityDesigner. Si vous voulez récupérer une référence sur l’objet pour vous faciliter la vie après, pensez à surcharger la méthode Initialize avec un code du style :

    public class YourActivityDesigner : ActivityDesigner

    {

 

        protected override void Initialize(Activity activity)

        {

            base.Initialize(activity);

            _activity = (YourActivity)activity;

        }

 

Puis, surchargez OnMouseDoubleClick :

        protected override void OnMouseDoubleClick( MouseEventArgs e )

        {

            base.OnMouseDoubleClick(e);

        }

 

Enfin, placez l’attribut ActivityDesigner sur votre activité :

[Designer(typeof(YourActivityDesigner), typeof(IDesigner))]

 

Libre à vous d’instancier une Windows Form en mode Dialog pour récupérer un paramétrage, puis l’appliquer à l’objet Activity précédemment stocké.

Interception du double-click dans une activité tierce

Si vous n’utilisez que des activités fait maison, c’est bien. Mais quid des activités trierces (celles du runtime ou provenant d’autres personnes) ?

 

La solution consiste alors à intercepter le double-click au niveau du designer lui-même. Lorsque vous instanciez votre DesignSurface pour y ajouter un objet WorkflowView, profitez en pour ajouter un filtre de message :

_workflowView.AddDesignerMessageFilter(new CustomMessageFilter(_workflowView));

Avec CustomMessage dérivant de WorkflowDesignerMessageFilter et surchargeant OnMouseDoubleClick :

    public class CustomMessageFilter : WorkflowDesignerMessageFilter

    {

        private WorkflowView _view;

 

        public CustomMessageFilter(WorkflowView view)

            : base()

        {

            _view = view;

        }

 

        protected override bool OnMouseDoubleClick(MouseEventArgs eventArgs)

        {

            return true;

        }

    }

Il ne reste plus alors qu’à récupérer l’objet en cours de sélection (dans la méthode OnMouseDoubleClick) :

            ISelectionService selectionService = ((IServiceProvider)_view).GetService(typeof(ISelectionService)) as ISelectionService;

            object result = selectionService.PrimarySelection;

 Et voila :)