2010-11-11 32 views
1

J'essaie de créer un UserControl qui affiche une image de plusieurs pages et permet à l'utilisateur de zoomer, de faire pivoter et de parcourir une image. La partie avec laquelle je rencontre un problème est la configuration correcte des raccourcis clavier. J'ai compris que j'avais besoin de l'installation InputBindings sur la classe Window qui héberge UserControl. J'ai trouvé comment créer un InputBinding dans le code, mais je m'attends à beaucoup de raccourcis clavier et je pense que les avoir dans le XAML sera plus facile. Voici un exemple de projet que je teste ce dans:Lier à un UserControl RoutedCommand à partir de la fenêtre parent

MainWindow.xaml

<Window x:Class="CommandTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:CommandTest" 
Title="Window1" Height="300" Width="344"> 
<Window.InputBindings> 
    <KeyBinding 
     Key="N" 
     CommandTarget="x:UCon" 
     /> 
</Window.InputBindings> 

<StackPanel> 
    <local:NestedControl x:Name="UCon"> 
    </local:NestedControl> 
</StackPanel> 
</Window> 

MainWindow.Xaml.cs

using System.Windows; 
using System.Windows.Input; 

namespace CommandTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      KeyGesture keyg = new KeyGesture(Key.OemPlus, ModifierKeys.Control); 

      KeyBinding kb = new KeyBinding((ICommand)UCon.Resources["Commands.ZoomOut"], keyg); 

      kb.CommandTarget = UCon; 

      this.InputBindings.Add(kb); 
     } 

    } 
} 

UserControl1.xaml

<UserControl x:Class="CommandTest.NestedControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <UserControl.Resources> 
     <!-- UI commands. -->   
     <RoutedCommand x:Key="Commands.ZoomOut" />   
    </UserControl.Resources> 

    <UserControl.CommandBindings> 
     <CommandBinding x:Name="ZoomCommand" Command="{StaticResource Commands.ZoomOut}" CanExecute="ZoomCommand_CanExecute" Executed="ZoomCommand_Executed"/>   
    </UserControl.CommandBindings> 
    <Button Command="{StaticResource Commands.ZoomOut}">Zoom</Button> 
</UserControl> 

UserControl1.xaml.cs

using System.Windows.Controls; 
using System.Windows.Input; 

namespace CommandTest 
{ 
    public partial class NestedControl : UserControl 
    { 
     public NestedControl() 
     { 
      InitializeComponent(); 
     } 

     private void ZoomCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = true; 
     } 

     private void ZoomCommand_Executed(object sender, ExecutedRoutedEventArgs e) 
     { 
      System.Windows.MessageBox.Show("Zoom", "Zoom"); 
     }   
    } 
} 

Répondre

0

Au lieu de lier la clé de la fenêtre, se lient à la commande elle-même (Vous pouvez le faire dans le constructeur pour ZoomCommand si cela est une commande personnalisée):

ZoomCommand.InputGestures.Add(new KeyGesture(Key.N)); 

Ensuite, dans le constructeur pour UserControl:

Window.GetWindow(this).CommandBindings.Add(new CommandBinding(new ZoomCommand(), ZommCommand_handler)); 
+0

La création de la commande dans le code est-elle une meilleure solution que la création de la commande en XAML? Cela signifie également que vous ne pouvez pas ajouter le InputBinding à l'hôte du contrôle UserControl en XAML? En outre, cette solution ne fonctionne pas. Le UserControl1 n'a pas KeyboardFocus de sorte que InputBinding ne se déclenche jamais. Si vous cliquez sur le bouton, puis utilisez le KeyGesture, le MessageBox affichera – Gariig

+0

Que vous utilisiez du code ou du XAML pour créer les commandes dépend vraiment de vous - ni l'un ni l'autre n'est "meilleur". J'ai choisi le code ici parce qu'il nécessite moins de lignes, ce qui pourrait être un peu plus facile à comprendre. J'ai édité ma réponse pour lier la commande à la fenêtre à la place. –