Uma maneira é adicionar as teclas de atalho aos próprios comandos, como InputGestures
. Comandos são implementados como RoutedCommands
.
Isso permite que as teclas de atalho funcionem mesmo se não estiverem conectadas a nenhum controle. E como os itens de menu entendem os gestos do teclado, eles exibirão automaticamente sua tecla de atalho no texto dos itens de menu, se você conectar esse comando ao item de menu.
Crie um atributo estático para armazenar um comando (de preferência como uma propriedade em uma classe estática criada para comandos - mas, para um exemplo simples, basta usar um atributo estático em window.cs):
public static RoutedCommand MyCommand = new RoutedCommand();
Adicione as teclas de atalho que devem chamar o método:
MyCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
Crie uma ligação de comando que aponte para o seu método para chamar na execução. Coloque-os nas ligações de comando do elemento da interface do usuário sob o qual ele deve trabalhar (por exemplo, a janela) e o método:
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:MyWindow.MyCommand}" Executed="MyCommandExecuted"/>
</Window.CommandBindings>
private void MyCommandExecuted(object sender, ExecutedRoutedEventArgs e) { ... }
Executed
código do comando terminará no code-behind (da janela ou no controle do usuário), e não no modelo de visualização, em vez de usar um comando usual (ICommand
implementação personalizada ).Eu achei que isso era exatamente o que eu estava procurando relacionado à ligação de chaves no WPF:
Ver postagem no blog MVVM CommandReference and KeyBinding
fonte
Experimente este código ...
Primeiro, crie um objeto RoutedComand
fonte
Depende de onde você deseja usá-los.
TextBoxBase
controles derivados já implementam esses atalhos. Se você quiser usar atalhos de teclado personalizados, consulte os gestos de comandos e entrada. Aqui está um pequeno tutorial do Switch on the Code : Tutorial do WPF - Ligações de comandos e comandos personalizadosfonte
Documentar essa resposta para outras pessoas, pois existe uma maneira muito mais simples de fazer isso, que raramente é referenciada e que não exige o toque no XAML.
Para vincular um atalho de teclado, no construtor Window, adicione um novo KeyBinding à coleção InputBindings. Como o comando, passe sua classe de comando arbitrária que implementa o ICommand. Para o método execute, simplesmente implemente a lógica que você precisa. No meu exemplo abaixo, minha classe WindowCommand leva um delegado que será executado sempre que chamado. Quando eu construo o novo WindowCommand para passar com minha ligação, eu simplesmente indico no meu inicializador, o método que eu quero que o WindowCommand execute.
Você pode usar esse padrão para criar seus próprios atalhos de teclado rápidos.
Crie uma classe WindowCommand simples, que leva um delegado de execução para disparar qualquer método definido nela.
fonte
Eu tive um problema semelhante e achei a resposta da @ aliwa a solução mais útil e elegante; no entanto, eu precisava de uma combinação de teclas específica, Ctrl+ 1. Infelizmente, recebi o seguinte erro:
Com um pouco mais de pesquisa, modifiquei a resposta da @ aliwa para o seguinte:
Achei que isso funcionou muito bem para qualquer combinação que eu precisasse.
fonte
<UserControl.InputBindings> <KeyBinding Gesture="Enter" Command="{Binding someCommand}"/> </UserControl.InputBindings>
VB.NET:
Dentro do evento carregado :
Não é necessário XAML.
fonte
Embora as respostas principais estejam corretas, eu pessoalmente gosto de trabalhar com propriedades anexadas para permitir que a solução seja aplicada a qualquer uma
UIElement
, especialmente quando elaWindow
não está ciente do elemento que deve ser focado. Na minha experiência, muitas vezes vejo uma composição de vários modelos de visualização e controles de usuário, em que a janela geralmente nada mais é que o contêiner raiz.Snippet
Com esta propriedade anexada, você pode definir um atalho de foco para qualquer UIElement. Ele registrará automaticamente a ligação de entrada na janela que contém o elemento.
Uso (XAML)
Código fonte
A amostra completa, incluindo a implementação do FocusElementCommand, está disponível como gist: https://gist.github.com/shuebner20/c6a5191be23da549d5004ee56bcc352d
Isenção de responsabilidade: Você pode usar este código em qualquer lugar e gratuitamente. Lembre-se de que esta é uma amostra que não é adequada para uso pesado. Por exemplo, não há coleta de lixo de elementos removidos porque o Comando manterá uma forte referência ao elemento.
fonte
Como associar o comando a
MenuItem
:fonte