2010-11-11 2 views
1

Я пытаюсь создать UserControl, который отображает многостраничное изображение и позволяет пользователю увеличивать, поворачивать и просматривать изображение. У одной части, с которой я столкнулся, - это правильно настроить ярлыки клавиатуры. Я понял, что мне нужно иметь установку InputBindings в классе Window, в котором размещается UserControl. Я понял, как создать InputBinding в коде, но я ожидаю много сочетаний клавиш, и я думаю, что их в XAML будет проще. Вот пример проекта, который я проверяю это в:Привязать к UserControl RoutedCommand из родительского окна

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"); 
     }   
    } 
} 

ответ

0

Вместо привязки ключа к окну, привязать его к самой команде (Вы можете сделать это в конструкторе ZoomCommand, если это команда запуска):

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

Затем, в конструкторе UserControl:

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

Создает команду в коде лучше, чем создание команды в XAML? Также это означает, что вы не можете добавить InputBinding на хост UserControl в XAML? Кроме того, это решение не работает. У UserControl1 нет KeyboardFocus, поэтому InputBinding никогда не срабатывает. Если вы нажмете на кнопку, а затем используйте KeyGesture, то MessageBox покажет – Gariig

+0

Независимо от того, используете ли вы код или XAML для создания команд, это действительно зависит от вас - ни «лучше». Я выбрал код здесь, потому что он требует меньше строк, поэтому может быть немного легче понять. Я отредактировал свой ответ, чтобы привязать команду к окну. –

Смежные вопросы