2016-06-08 2 views
0

Я пытаюсь добавить функциональность, позволяющую пользователю «увеличивать масштаб» на веб-странице, отображаемой в графическом интерфейсе WPF моего приложения WPF, с помощью клавиатуры ,WPF XAML Grid-KeyBinding не работает

У меня есть следующие функции в коде-за моего XAML:

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

Чтобы включить эту функцию, чтобы назвать, я добавил следующие <Grid.InputBindings> теги к <Grid>, которые я использую для отображения 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(...) должна быть вызвана, когда кнопка + нажата на клавиатуре, когда сетка displayin g браузер имеет фокус.

Но, когда я запускаю свое приложение и нажимаю внутри браузера, чтобы убедиться, что он имеет фокус, если я затем нажимаю «+» на клавиатуре, ничего не происходит, и я даже не вижу отладки от моей функции zoomInExecuted() в консоли, поэтому кажется, что нажатие клавиши «+» фактически не вызывает эту функцию. Правильно ли я сделал KeyBinding? Что-то мне не хватает в моем коде здесь?

Редактировать

Я попытался с помощью ICommand, как это было предложено в ответах:

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

и называя это в KeyBinding в XAML:

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

но I 'Получает ошибку компиляции в C#, которая гласит:

Тип или пространство имен имя «DelegateCommand» не может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?)

ли мне нужно добавить конкретную ссылку или using заявление для того, чтобы быть в состоянии использовать это?

Редактировать

Я также попытался добавить <KeyBinding ...> теги, как в <Grid>, что держит объект браузера, и сам браузер в XAML, т.е.

<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+ на клавиатуре никогда не регистрируется приложением ...

Есть ли EventHandler/KeyboardListener или что-то подобное, что мне нужно добавить в приложение?

+0

'Command = {{Binding Path = zoomInExecuted}" означает привязать свойство Command к свойству 'zoomInExecuted' типа' ICommand', а не к методу, который вы пытаетесь сделать. Прочитайте ссылки на команды. – Clemens

+0

Вам нужен код, который прикрепляется к событию и выполняет его, построенный как ICommand. Взгляните на ответы здесь: http://stackoverflow.com/questions/939388/binding-commands-to-events –

ответ

0

Отсутствует Icommand для соединения метода. Иначе все правильно. Для выполнения метода вам необходимо иметь свойство типа ICommand. И затем используйте это свойство для вызова метода, который вы хотите. См. Ссылку.Существует реле команды создана, которая может быть использована в качестве родовых команд, в которой вы можете передать свой метод, который вы хотите выполнить

Binding Button click to a method

1

Вы не можете связываться с функцией, вы должны использовать Command:

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

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

DelegateCommand является частью Microsoft.Practices.Prism. Вы можете скачать его here

В комплект включены также некоторые рамки MVVM.

+0

Привет, спасибо за ваш ответ. Я добавил команду 'command', которую вы предложили моему C#, но я получаю ошибку компиляции, в которой говорится, что' Тип или имя пространства имен 'DelegateCommand' не удалось найти (вам не хватает ссылки на директиву или сборку?) '. Есть ли что-то, что мне нужно добавить «ссылку», чтобы иметь возможность использовать его, или мне нужно конкретное выражение 'using'? – someone2088

+0

@ someone2088, я добавил некоторое объяснение в ответ – Natxo

0

Вы не можете связать функцию. Вам необходимо создать ICommand с целью привязки.

Предполагая, что вы внедрили шаблон MVVM в приложении, необходимо выполнить команду RelayCommand.

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