2010-06-21 12 views

Répondre

2

Voici comment WPF utilise ApplicationCommand.Close:

  1. WPF lui-même n'a pas intégré dans le gestionnaire de commande pour ApplicationCommands.Close, mais
  2. WPF exécute le ApplicationCommand.Close RoutedCommand chaque fois qu'il reçoit le message Win32 WM_APPCOMMAND avec lParam=APPCOMMAND_CLOSE. Cela signifie que si une application Win32 vous envoie un APPCOMMAND_CLOSE, votre gestionnaire ApplicationCommand.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:

  1. scénarios ACCESSIBILITÉ
  2. claviers qui ont une « Fermer la fenêtre » clé
  3. 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.

1

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)); 
2

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.