2010-06-14 7 views
4

J'ai une application WPF avec la KeyBinding suivante sur la fenêtre principale:Quelle est la meilleure façon de gérer le même raccourci dans les contrôles WPF et WinForms?

<KeyBinding Command="Commands:EditCommands.Undo" Gesture="CTRL+Z" /> 
<KeyBinding Command="Commands:EditCommands.Redo" Gesture="CTRL+Y" /> 

Cela rend la commande répondre à l'amende raccourci. Toutefois, dans tous les endroits où j'ai incorporé des zones de texte WinForms ou des zones de texte enrichi, j'ai perdu la possibilité d'utiliser ces raccourcis. Si je supprime les liaisons ci-dessus, les raccourcis WinForms fonctionnent correctement.

Comment puis-je prendre en charge ces raccourcis dans WinForms et WPF? Je préférerais une méthode générique puisque ce problème est susceptible d'affecter de nombreuses autres commandes avec les mêmes raccourcis clavier.

Répondre

2

Je suis perplexe pourquoi vous n'utilisez pas les commandes intégrées:

  • ApplicationCommands.Undo et
  • ApplicationCommands.Redo

Il y a plusieurs avantages à l'utilisation de ces commandes intégrées :

  1. Leurs raccourcis clavier sont automatiquement définis pour vous en fonction des paramètres régionaux (Ctrl + Z et Ctrl + Y peut ne pas être les touches par défaut undo/redo dans toutes les langues)
  2. Ils sont honorés par TextBox et RichTextBox
  3. Ils traversent la WPF < -> limite WinForms sans aucun problème
  4. Ils travaillent avec des interfaces d'accessibilité
  5. Ils sont appelés par haut-clés « undo » sur les claviers qui les ont

Si possible, vous devez utiliser le ApplicationCommands intégré en inscrivant simplement CommandBindings pour eux aux endroits appropriés dans votre code.

Plus d'informations

Si vous utilisez la fonctionnalité intégrée undo/redo dans les deux WPF et WinForms, ça marche. Par exemple, ce qui suit crée deux RichTextBoxes, l'un basé sur WinForms et un sur WPF, et les deux ont plein Undo/Redo capacités:

<UniformGrid Columns="2" 
    xmlns:winforms= 
    "clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"> 

    <WindowsFormsHost > 
    <winforms:RichTextBox /> 
    </WindowsFormsHost> 

    <RichTextBox /> 

</UniformGrid> 

Depuis cela fonctionne et le vôtre n'a pas, essayer de comprendre ce qui est différent . Vous avez dit dans vos commentaires que vous avez essayé de supprimer le WPF personnalisé InputBindings. Avez-vous fait la même chose du côté de WinForms? Si ce n'est pas le cas, essayez-le, ou si ce n'est pas possible, éditez votre question pour montrer ce code aussi.

Notez que vous pouvez remapper ApplicationCommands dans votre propre RoutedCommands: Il suffit d'ajouter un CommandBinding et le feu dans le gestionnaire de votre commande RoutedCommand.

+0

Nous utilisons une classe de base pour nos commandes qui ont les délégués directement dans la commande, donc nous avons défini toutes nos commandes comme ça. Il était plus simple pour nous d'y déplacer les commandes Annuler/Rétablir. Mais peu importe, même si j'utilise la commande intégrée, j'ai toujours le même problème. Les liaisons d'entrée WPF bloquent les mêmes liaisons de travailler sur les zones de texte WinForms. –

+0

Quelque chose d'étrange se passe, puisque cela fonctionne normalement. J'ai ajouté plus d'informations à ma réponse pour vous aider à le retrouver. Cela peut avoir quelque chose à voir avec la façon dont vous interceptez Ctrl-Y et Ctrl-Z sur le côté WinForms de l'image. –

+0

Bien que cela puisse fonctionner pour ces touches de raccourci spécifiques, il ne répond pas réellement à la question ou ne m'aide pas, puisque je n'utilise * pas * les commandes intégrées. –