tag propiedad c# wpf menu commandbinding inputbinding

propiedad tag c#



Control de enlace de entrada y WebBrowser (1)

Solución fácil

Agregue los enlaces de entrada al control WebBrowser así como también al menú principal:

Browser.InputBindings.Add(new KeyBinding(ApplicationCommands.Open, new KeyGesture(Key.O, ModifierKeys.Control)));

Solución dura

Lo que está sucediendo aquí es que UIElement está utilizando el evento KeyDown , mientras desea usar el evento PreviewKeyDown o agrega un controlador que también maneja eventos enrutados manejados. Busca Tuneling y Bubbling si no sabes nada de esto.

Como esto se maneja en la clase UIElement, aconsejaría utilizar un patrón diferente en esta situación. El marco de MVVM Light proporciona un comportamiento de EventToCommand . Si puede enrutar el evento PreviewKeyDown de la ventana a los comandos correctos en lugar de usar KeyBinding con la colección InputBindings del UIElement , tendrá su solución.

Necesitará algún código personalizado para verificar qué tecla se presionó y a qué comando debería estar el enrutamiento.

Tengo una aplicación muy simple en la que intento unir atajos de teclado a un comando WPF que está vinculado a un elemento del menú. La aplicación en sí consiste en solo un Menu y un control WebBrowser .

Cuando estoy dentro de WebBrowser , los atajos de teclado no se enrutan hasta el Menú de WPF. Por ejemplo, al escribir ''Ctrl + O'' cuando se enfoca en el navegador web, se muestra la página abierta de IE. Además, en esta aplicación, a menos que tenga el Menú enfocado (escribiendo Alt), los enlaces de entrada no se disparan. Por ejemplo, no puedo enfocarme en la ventana de WPF haciendo clic en la barra de título y luego escribo los accesos directos. El código completo se replica a continuación:

MainWindow.xaml

<Window x:Class="TestInputBindingsOnMenu.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="600" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Menu IsMainMenu="True" x:Name="_mainMenu" Grid.Row="0" /> <WebBrowser Source="http://google.com" Grid.Row="1" /> </Grid> </Window>

MainWindow.xaml.cs

using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace TestInputBindingsOnMenu { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Initialize(); } private void Initialize() { MenuItem fileMenu = new MenuItem(); MenuItem fileNew = new MenuItem(); MenuItem fileOpen = new MenuItem(); MenuItem fileExit = new MenuItem(); fileMenu.Header = "File"; fileNew.Header = "New"; fileOpen.Header = "Open"; fileExit.Header = "Exit"; fileMenu.Items.Add(fileNew); fileMenu.Items.Add(fileOpen); fileMenu.Items.Add(fileExit); _mainMenu.Items.Add(fileMenu); var fileNewCommand = CreateCommand("New"); var fileOpenCommand = CreateCommand("Open"); var fileExitCommand = CreateCommand("Exit"); _mainMenu.CommandBindings.Add(new CommandBinding(fileNewCommand, ExecuteNew)); _mainMenu.CommandBindings.Add(new CommandBinding(fileOpenCommand, ExecuteOpen)); _mainMenu.CommandBindings.Add(new CommandBinding(fileExitCommand, ExecuteExit)); fileNew.Command = fileNewCommand; fileOpen.Command = fileOpenCommand; fileExit.Command = fileExitCommand; _mainMenu.InputBindings.Add(new InputBinding(fileNewCommand, new KeyGesture(Key.N, ModifierKeys.Control))); _mainMenu.InputBindings.Add(new InputBinding(fileOpenCommand, new KeyGesture(Key.O, ModifierKeys.Control))); _mainMenu.InputBindings.Add(new InputBinding(fileExitCommand, new KeyGesture(Key.F4, ModifierKeys.Alt))); } private void ExecuteNew(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("New!!"); } private void ExecuteOpen(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("Open!!"); } private void ExecuteExit(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("Exit!!"); } private static RoutedCommand CreateCommand(string label) { return new RoutedCommand(label, typeof(MainWindow)); } } }