Dois-je utiliser ApplicationCommands.Close
pour fermer les boîtes de dialogue modales ou cette commande est-elle considérée comme réservée à la fermeture de l'application? Si c'est le dernier, les gens créent Close
commandes pour chaque boîte Dialog
ou juste une seule commande Close
pour toutes leurs boîtes de dialogue modales?Existe-t-il une commande Close pour les boîtes de dialogue dans l'infrastructure de commande WPF?
Répondre
Voici comment WPF utilise ApplicationCommand.Close:
- WPF lui-même n'a pas intégré dans le gestionnaire de commande pour
ApplicationCommands.Close
, mais - WPF exécute le
ApplicationCommand.Close
RoutedCommand chaque fois qu'il reçoit le message Win32WM_APPCOMMAND
aveclParam=APPCOMMAND_CLOSE
. Cela signifie que si une application Win32 vous envoie unAPPCOMMAND_CLOSE
, votre gestionnaireApplicationCommand.Close
sera appelé.
Le documentation pour APPCOMMAND_CLOSE
donne cette définition:
Fermer la fenêtre (pas l'application).
Je suppose que les applications WPF devraient traiter ApplicationCommand.Close
de la même manière, et que « la fenêtre » engloberait les boîtes de dialogue (il le fait généralement dans le monde de Win32).
Pourquoi vous souciez-vous de ce que dit la documentation Win32? Il pourrait être important dans trois situations:
- scénarios ACCESSIBILITÉ
- claviers qui ont une « Fermer la fenêtre » clé
- Lorsque l'utilisateur a configuré une combinaison de boutons de souris pour envoyer la commande « Fermer la fenêtre »
pour répondre à votre question: non, ApplicationCommand.Close
est pas réservé à la fermeture de l'application. Son but est de fermer la fenêtre, y compris une fenêtre de boîte de dialogue. Il n'est donc pas nécessaire de créer des commandes séparées pour fermer les boîtes de dialogue.
De nombreuses applications utilisent simplement un style dans App.xaml pour définir une classe CommandBinding sur thw Window, et dans le gestionnaire, elles terminent en appelant ((Window)sender).Close()
. C'est une solution simple et élégante.
La fermeture d'une application est différente de la fermeture d'une boîte de dialogue.
Une commande intégrée permet de fermer les boîtes de dialogue. Il y a un grand 'X' rouge en haut de n'importe quelle classe Window que vous créez. Lorsque vous cliquez sur ce 'X', vous générez un 'DialogCancelCommand' qui est ensuite géré par le gestionnaire d'événements 'OnDialogCancel' dans la classe Window. Cependant, pour des raisons qui ne sont connues que dans Redmond, le 'DialogCancelCommand' est un RoutedEvent interne. Je ne peux pas parler pour d'autres ingénieurs, mais j'ai reproduit le 'DialogCancelCommand' du code Reflected afin que je puisse fermer les boîtes de dialogue de la même façon que les commandes internes exécutent la même opération.
/// <summary>
/// Cancels a dialog.
/// </summary>
public static readonly RoutedCommand DialogCancelCommand = new RoutedCommand("DialogCancel", typeof(CoreCommands));
Si vous êtes à la recherche de lier un clic de bouton pour fermer une boîte de dialogue, vous pouvez définir la propriété IsCancel
sur le bouton as recommended in the docs:
<Button IsCancel="True">Cancel</Button>
Lorsque vous cliquez sur ce, il fermera la dialogue avec un résultat false
. Si vous voulez fermer avec un résultat true
, un moyen très simple est d'ajouter un gestionnaire de clic et d'écrire deux (2) lignes de code-behind. Votre XAML est:
<Button IsDefault="True" Click="acceptButton_Click">OK</Button>
Et le code-behind:
void acceptButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
Cette se fermer la boîte de dialogue et retourner un résultat true
.
Puisqu'il s'agit d'un code de vue (fermer une fenêtre), ce code-behind ne me cause généralement aucune contrainte dans mes architectures MVVM strictes. YDMV.