2009-09-10 4 views
0

Я пишу приложение WPF всего несколькими командами, поэтому я использую панель инструментов без меню. Я хотел бы назначить сочетания клавиш ctrl на кнопки на панели инструментов. Есть ли простой способ сделать это, без необходимости создавать маршрутизированные команды или ICommands только для поддержки ярлыков? Я бы предпочел сделать это в XAML, а не в коде.Ярлыки клавиш на панели инструментов

ответ

0

Я пришел к выводу, что WPF не предоставляет простой способ добавить клавишу Ctrl к кнопке. Я решил проблему, улавливая нажатие клавиш в коде, а затем вызывая соответствующую ICommand - ICommand, к которой привязано свойство Command соответствующей кнопки. Это немного уродливый взлом, но он работает, и, похоже, это лучший подход в данных обстоятельствах.

+2

Основываясь на вашем комментарии к моему ответу, я не уверен, что понял ваш вопрос. Но я думаю, что ты это переусердствовал.WPF CommandBindings делает именно то, что вам нужно, пока элемент управления, который вы используете, имеет атрибут Command. Вы просто устанавливаете ApplicationCommand, и жест клавиатуры автоматически устанавливается на него. В моем примере, если вы сделаете Ctrl + O, CommandBinding_Executed будет запущен. – Carlo

1

Вам нужен код, одно событие сообщает команде, может ли оно быть выполнено (не более нескольких строк обычно), а другое - что делать, поэтому каждый связанный с ним контроль делает то же самое. Вот очень простой пример:

XAML:

<UserControl x:Class="WPFTests.AppCommands" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300"> 
    <UserControl.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> 
    </UserControl.CommandBindings> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <CheckBox Grid.Row="0" Height="16" Name="checkBoxCanExecute" Margin="8" IsChecked="true">Can execute</CheckBox> 
     <Button Grid.Row="1" Height="24" Padding="8,0,8,0" HorizontalAlignment="Left" Margin="8" Command="ApplicationCommands.New">ApplicationCommand.New</Button> 
    </Grid> 
</UserControl> 

C#

использованием System.Windows; с использованием System.Windows.Controls; с использованием System.Windows.Input;

namespace WPFTests 
{ 
    /// <summary> 
    /// Interaction logic for AppCommands.xaml 
    /// </summary> 
    public partial class AppCommands : UserControl 
    { 
     public AppCommands() 
     { 
      InitializeComponent(); 
     } 

     private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
     { 
      e.CanExecute = (bool)checkBoxCanExecute.IsChecked; 
     } 

     private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
     { 
      MessageBox.Show("New executed"); 
     } 
    } 
} 

EDIT: По запросу RichardOD. Вот немного больше информации я отвечал в моем комментарии:

<Button Command="ApplicationCommands.New"> 

Это ставит клавиатуру жест Ctrl + N на кнопке. Если вы должны были сделать

<Button Command="ApplicationCommands.Open"> 

Он поместил бы Ctrl + O. Это неявно реализовано в CommandBindings WPF. Вы можете даже создать свою собственную команду своим собственным жестом. А если связать команду с пунктом меню, он будет автоматически показывать жест рядом с названием команды без каких-либо дополнительных efforr, просто:

<MenuItem Command="ApplicationCommands.New" /> 

Это покажет [Новый Ctrl + N] в пункте меню.

+0

Спасибо за ответ, но я не думаю, что он отвечает на вопрос, который я задал. Все, что я хочу сделать, это поместить Ctrl-Key на кнопку; например, Ctrl-O, чтобы вызвать кнопку «Открыть файл». –

+1

+0

+1 Карло, я бы переместил ваш комментарий в ответ, так как ваш комментарий действительно является ответом. :) – RichardOD

0

Самый простой и грязный способ - просто добавить ярлык клавиатуры самостоятельно. Конечно, если вы меняете ярлык, который вы используете в Command, вы должны вручную его изменить в подсказке инструмента. Но может быть, мы можем привязать текст подсказки инструмента к свойствам Command, чтобы получить ярлык через привязку? Кто-нибудь знает, если это возможно?

 <Button Command="{Binding OpenDllCommand}" Content="Bla-bla > 
      <Button.ToolTip> 
       <StackPanel> 
        <TextBlock Text="F6" FontWeight="Bold" /> 
        <TextBlock Text="Open MbUnit/MINT DLL with tests" /> 
       </StackPanel> 
      </Button.ToolTip> 
     </Button> 
Смежные вопросы