WPF XAML Grid- KeyBinding似乎不起作用

时间:2016-06-08 11:14:53

标签: c# wpf xaml keyboard-shortcuts

我正在尝试添加功能,以允许用户使用键盘在我的WPF应用程序的GUI上ChromiumWebBrowser中显示的网页上“放大”。

我在XAML的代码隐藏中有以下功能:

private void zoomInExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        Console.WriteLine("'zoomInExecuted() called. ");
        browser.ZoomLevel++;
    } 

要启用此功能,我已将以下<Grid.InputBindings>标记添加到我用于显示<Grid>的{​​{1}}中:

ChromiumWebBrowser

据我了解,这应该意味着当显示浏览器的网格具有焦点时,在键盘上按下 <Grid x:Name="grdBrowserHost" MinHeight="900" Height="Auto" MinWidth="1205" Width="Auto" Margin="5,0,0,0" DockPanel.Dock="Bottom" Grid.ColumnSpan="1" > <Grid.InputBindings> <KeyBinding Key="Add" Command="{Binding Path=zoomInExecuted}"></KeyBinding> </Grid.InputBindings> ... </Grid> 按钮时应调用zoomInExecuted(...)函数。

但是,当我运行我的应用程序,并在浏览器中单击以确保它具有焦点时,如果我按下键盘上的“+”,则没有任何反应,我甚至没有看到来自{{1在控制台中的函数,所以似乎按下'+'键实际上并没有调用该函数。我是否正确完成了+?我的代码中是否有我遗漏的东西?

修改

我已尝试使用zoomInExecuted(),如答案所示:

KeyBinding

并在XAML中的ICommand中调用它:

public ICommand zoomInCommand
    {
        get
        {
            _zoomIn = new DelegateCommand(zoomInExecuted()); //CallZoomIn());
            return zoomIn;
        }
    }

但是我在C#中遇到了编译错误:

  

找不到类型或命名空间名称'DelegateCommand'(您是否缺少using指令或程序集引用?)

我是否需要添加特定的引用或KeyBinding语句才能使用它?

修改

我还尝试将<KeyBinding Key="Add" Command="{Binding Path=zoomInCommand}"></KeyBinding> 标签添加到持有浏览器对象的using和XAML中的浏览器本身,即

<KeyBinding ...>

<Grid>函数似乎永远不会被调用(我从未在控制台中看到此函数的调试) - 似乎按下键盘上的<Grid x:Name="grdBrowserHost" MinHeight="900" Height="Auto" MinWidth="1205" Width="Auto" Margin="5,0,0,0" DockPanel.Dock="Bottom" Grid.ColumnSpan="1" > <Grid.InputBindings> <KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding zoomInExecuted}"></KeyBinding> </Grid.InputBindings> ... <cefSharp:ChromiumWebBrowser Name="browser" Height="Auto" Width="Auto" Grid.Row="0" Address="https://web.riviam.com" Margin="25,35,-0.2,0" > <cefSharp:ChromiumWebBrowser.InputBindings> <KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding zoomInExecuted}"></KeyBinding> </cefSharp:ChromiumWebBrowser.InputBindings> </cefSharp:ChromiumWebBrowser> 永远不会被应用程序注册。 ..

我需要在应用程序中添加zoomInExecuted(...) / CTRL+或类似内容吗?

3 个答案:

答案 0 :(得分:1)

您无法绑定到某个功能,您必须使用Command

<KeyBinding Key="Add" Command="{Binding ZoomInCommand}"></KeyBinding>

public ICommand ZoomInCommand
{
    get
    {
        _zoomIn = new DelegateCommand(CallZoomIn());
        return zoomIn;
    }
}

DelegateCommandMicrosoft.Practices.Prism的一部分。您可以下载here

大多数MVVM框架也包括它。

答案 1 :(得分:0)

缺少方法链接部分的Icommand。否则一切都是正确的。要执行方法,您需要具有ICommand类型的属性。然后使用该属性调用所需的方法。请看链接。创建了relay命令,可以将其用作通用命令,您可以在其中传递要执行的方法

Binding Button click to a method

答案 2 :(得分:0)

你无法绑定一个函数。您需要为绑定创建 ICommand

假设您在整个应用中实施了MVVM模式,则需要实施 RelayCommand