Bien que MessageBox soit bien adapté aux avertissements de bas niveau, elle n'est souvent pas la solution la plus conviviale lorsqu'il s'agit d'avertissements métier. Ce post décrit une technique permettant d'afficher un UserControl de manière pseudo-modale en jouant à la fois avec un effet visuel et le focus. Les bénéfices d'une telle technique sont les suivants :
Le projet exemple affiche le UserControl pseudo-modal en cliquant sur le bouton "Afficher MyUserControl". Lors de cet affichage les boutons d'origine deviennent inaccessibles tandis que le focus est passé de manière exclusive au nouveau contrôle. Le bouton "Fermer" de MyUserControl permet de revenir à l'écran d'origine.
Le fonctionnement se base sur le Panel principal de la fenêtre parente qui est de type Canvas. Cela permet ainsi de positionner le UserControl modal où l'on désire sur le plan, tout en le superposant par le biais de la propriété attachée ZIndex. Si le Panel principal de votre application n'est pas un Canvas - et cela n'est en effet quasiment jamais le cas - il suffira de placer le précédent panel parent comme seul enfant du nouveau Canvas (par exemple Window.Grid deviendrait donc Window.Canvas.Grid).
Lorsque l'on souhaite afficher le UserControl modal, les opérations suivantes sont effectuées:
control.IsEnabledChanged += new DependencyPropertyChangedEventHandler(delegate(object sender2, DependencyPropertyChangedEventArgs e2)
{
if ((bool)e2.NewValue == true) return;
myCanvas.Children.Remove(control);
myCanvas.Children.Remove(grayRectangle);
});
Note: le UserControl modal étant situé dans le visual tree de la fenêtre parente, les styles définis au niveau fenêtre sont appliqués.
Merci à Benoist et Maxime pour l'idée de ce post.