Есть другие способы сделать это и, вероятно, веские причины не делать это таким образом, но вот реализация, которая помещает команды в пользовательский элемент управления:
Код пользовательского контроля (может быть также простым элементом управления):
public partial class TestControl : UserControl
{
//Declare routed commands
public static RoutedCommand IncrementCommand;
public static RoutedCommand DecrementCommand;
static TestControl()
{
//Create routed commands and add key gestures.
IncrementCommand = new RoutedCommand();
DecrementCommand = new RoutedCommand();
IncrementCommand.InputGestures.Add(new KeyGesture(Key.Add, ModifierKeys.Control));
DecrementCommand.InputGestures.Add(new KeyGesture(Key.Subtract, ModifierKeys.Control));
}
public TestControl()
{
//Subscribe to Increment/Decrement events.
TestControl.Decremented += down;
TestControl.Incremented += up;
InitializeComponent();
}
//Declare *static* Increment/Decrement events.
public static event EventHandler Incremented;
public static event EventHandler Decremented;
//Raises Increment event
public static void IncrementMin(object o, ExecutedRoutedEventArgs args)
{
if (Incremented != null)
{
Incremented(o, args);
}
}
//Raises Decrement event
public static void DecrementMin(object o, ExecutedRoutedEventArgs args)
{
if (Decremented != null)
{
Decremented(o, args);
}
}
//Handler for static increment
private void down(object o, EventArgs args)
{
Min--;
}
//Handler for static decrement
private void up(object o, EventArgs args)
{
Min++;
}
//Backing property
public int Min
{
get { return (int)GetValue(MinProperty); }
set { SetValue(MinProperty, value); }
}
public static readonly DependencyProperty MinProperty =
DependencyProperty.Register("Min", typeof(int),
typeof(TestControl), new UIPropertyMetadata(0));
}
В окнах, в которых требуется такое поведение, необходимо добавить CommandBinding для этих команд.
Код окна позади:
public MainWindow()
{
InitializeComponent();
//Raise control's static events in response to routed commands
this.CommandBindings.Add(
new CommandBinding(TestControl.IncrementCommand, new ExecutedRoutedEventHandler(TestControl.IncrementMin)));
this.CommandBindings.Add(
new CommandBinding(TestControl.DecrementCommand, new ExecutedRoutedEventHandler(TestControl.DecrementMin)));
}
Это помогает?
(О, кстати, как написано, этот код реагирует только на клавиши +/- на моей клавиатуре, а не над клавишами (P) ([) (]) - я раньше не работал с клавишами Конечно, это не может быть очень нужно исправить.)