以编程方式单击WPF按钮

时间:2015-04-20 08:34:46

标签: c# wpf

我正在尝试将InputGesture绑定到Button。我的Button的XAML看起来像这样:

<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()如果&#34; Control + S&#34;点击。我的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));
    }
}

然而,当我点击&#34; Control + S&#34;时,没有任何反应。

1 个答案:

答案 0 :(得分:2)

对我来说,看起来你的手势绑定到错误的控制。

您需要从当前InputBindings访问Window

这样的事情:

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

这背后的技术原因是不会为没有聚焦的控件执行InputBindings。在可视树中,从聚焦元素到可视树的根(在我们的例子中是窗口)中搜索输入绑定的处理程序。当控件没有聚焦时,他将不会成为该搜索路径的一部分。