2015-04-20 2 views
2

Я пытаюсь связать InputGesture с кнопкой. XAML моей кнопки выглядит следующим образом:Запрограммировать кнопку WPF

<Button x:Name="StopButton" Content="{Binding StopLabel}" Command="{Binding StopCommand}" IsEnabled="{Binding StartCommand.IsExecuting}" /> 

StopCommand конкретизируется в ViewModel:

StopCommand = new Command(_someObject.btnStop_Click); 

Когда я вручную нажмите на кнопку, btnStop_Click() выполняется, как ожидалось.

Теперь я хочу добавить InputGesture (в CodeBehind), чтобы запустить btnStop_Click(), если щелкнуть «Control + S». Мой CodeBehind выглядит так:

public MainControl() 
{ 
    InitializeComponent(); 
    try 
    { 
     _cmd = new RoutedUICommand(); 
     _cmd.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control)); 
     CommandBindings.Add(new CommandBinding(_cmd, Interrupt_event_handler)); 
    } 
    catch (Exception err) 
    { 
     MessageBox.Show(err.Message); 
    } 
} 

private void Interrupt_event_handler(object sender, RoutedEventArgs e) 
{ 
    if (StopButton.IsEnabled) 
    { 
     StopButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent)); 
    } 
} 

Однако, когда я нажимаю «Control + S», ничего не происходит.

ответ

2

Для меня это похоже на то, что вы связываете свой жест с неправильным контролем.

Вам необходимо получить доступ к InputBindings с вашего текущего Window.

Что-то вроде этого:

var window = this.Parent as Window;  
window.InputBindings.Add(new InputBinding(yourStopButtonCommand, new KeyGesture(Key.S, ModifierKeys.Control))); 

Техническая Причина этого заключается в том, что InputBindings не будет выполняться для контроля, который не сфокусирован. Обработчик для привязки ввода выполняется в визуальном дереве от сфокусированного элемента до корня визуального дерева (в нашем случае это окно). Когда элемент управления не сфокусирован, он не будет частью этого пути поиска.