Question

J'ai fait quelques WPF programmation et une chose que je n'ai jamais eu a été le modèle de commande.Chaque exemple semble être intégrés dans ceux, de modifier, couper, coller.Quelqu'un a un exemple ou une suggestion de bonnes pratiques pour les commandes personnalisées?

Était-ce utile?

La solution

Ah ha!Une question, je peux répondre!Tout d'abord, je dois mentionner que j'ai personnellement trouvé plus facile de définir et de raccorder des commandes dans le code plutôt que dans le code XAML.Il me permet de brancher les gestionnaires pour les commandes un peu plus de souplesse qu'une XAML approche n'.

Vous devriez travailler sur ce que les commandes que vous voulez et ce qu'ils se rapportent.Dans mon application, j'ai actuellement une classe pour définir les importantes commandes d'application comme suit:

public static class CommandBank
{
  /// Command definition for Closing a window
  public static RoutedUICommand CloseWindow { get; private set; }

  /// Static private constructor, sets up all application wide commands.
  static CommandBank()
  {
    CloseWindow = new RoutedUICommand();
    CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
    // ...
  }

Maintenant, parce que je voulais garder le code tous ensemble, à l'aide d'un code unique approche de Commandes me permet de mettre les méthodes suivantes dans la classe ci-dessus:

/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
  ((Window)e.Parameter).Close();
}

/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = e.Parameter != null;
  e.Handled = true;
}

La deuxième méthode, il peut même être partagé avec d'autres Commandes sans avoir à me répéter toute la place.

Une fois que vous avez défini les commandes de ce genre, vous pouvez les ajouter à n'importe quel morceau de l'INTERFACE utilisateur.Dans la suite, une fois que la Fenêtre a Chargé, j'ai ajouter les liaisons de commande à la fois de la Fenêtre et MenuItem puis ajouter une entrée de la liaison à la Fenêtre à l'aide d'une boucle à faire cela pour toutes les liaisons de commande.Le paramètre transmis est la Fenêtre de son auto de sorte que le code ci-dessus ne sait ce que la Fenêtre pour essayer de le fermer.

public partial class SimpleWindow : Window
{
  private void WindowLoaded(object sender, RoutedEventArgs e)
  {
    // ...
    this.CommandBindings.Add(
      new CommandBinding(
        CommandBank.CloseWindow,
        CommandBank.CloseWindowExecute,
        CommandBank.CanExecuteIfParameterIsNotNull));

    foreach (CommandBinding binding in this.CommandBindings)
    {
       RoutedCommand command = (RoutedCommand)binding.Command;
       if (command.InputGestures.Count > 0)
       {
         foreach (InputGesture gesture in command.InputGestures)
         {
           var iBind = new InputBinding(command, gesture);
           iBind.CommandParameter = this;
           this.InputBindings.Add(iBind);
         }
       }
    }

    // menuItemExit is defined in XAML
    menuItemExit.Command = CommandBank.CloseWindow;
    menuItemExit.CommandParameter = this;
    // ...
  }

  // ....
}

Je puis aussi d'avoir plus tard des gestionnaires d'événements pour les WindowClosing et WindowClosed événements, je ne vous conseille de faire de la mise en œuvre effective de commandes comme les petites et générique que possible.Comme dans ce cas, je n'ai pas essayer de mettre le code qui tente d'empêcher la fermeture de Fenêtre si il y a des données non enregistrées, j'ai gardé que le code fermement à l'intérieur de la WindowClosing événement.

Laissez-moi savoir si vous avez des questions de suivi.:)

Autres conseils

En septembre 2008, édition de MSDN magazine, Brian Noyes a un excellent article sur les RoutedCommand/RoutedEvents!!!

Voici le lien:http://msdn.microsoft.com/en-us/magazine/cc785480.aspx

La chose à propos de XAML, c'est qu'il est très bien pour les "simples" des programmes, mais malheureusement, il ne fonctionne pas bien lorsque vous voulez faire des choses telles que le partage des fonctions.Disons que vous avez plusieurs classes et l'INTERFACE utilisateur qui avaient toutes les commandes qui n'ont jamais été désactivé, vous devriez écrire un " CanAlwaysExecute de la méthode pour chaque Fenêtre ou un UserControl!Ce n'est pas très SEC.

Après avoir lu plusieurs blogs et essayer plusieurs choses, j'ai fait le choix de faire des XAML purement une question d'apparence, de styles, de l'animation et des déclencheurs.Tous mes accrochage de gestionnaires d'événements et le commandant, est maintenant en baisse dans le code-behind.:)

Une autre chose à corriger par la façon dont est Saisie de liaison, afin d'être capturés, l'accent doit être mis sur l'objet qui contient l'Entrée des liaisons.Par exemple, pour avoir une coupe courte vous pouvez utiliser à tout moment (par exemple, la touche F1 pour ouvrir l'aide), que l'entrée de la liaison doit être défini sur l'objet de la Fenêtre, depuis toujours a le focus lorsque votre application est Active.À l'aide de la méthode du code devrait en faire plus facile, même lorsque vous commencez à utiliser les contrôles utilisateur qui peut vouloir ajouter entrée liaisons à leur Fenêtre parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top