WPF CommandBinding не работает

У меня есть кнопка в окне WPF. Я хочу отобразить сообщение, нажав левую кнопку мыши и нажав Ctrl+F. Я хочу большую часть кода в XAML. Код приведен ниже. Моя проблема в том, что у меня работает щелчок мышью, а не нажатие клавиши. Может кто-нибудь, пожалуйста, помогите мне. Заранее спасибо.

MyWindow.xaml

<Window x:Class="Commands_Xaml.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="164,88,0,0" Name="button1" VerticalAlignment="Top" Width="75">
            <Button.CommandBindings>
                <CommandBinding Command="ApplicationCommands.Find" Executed="CommandBinding_Executed"/> 
            </Button.CommandBindings>
            <Button.InputBindings>
                <KeyBinding Key="F" Modifiers="Control" Command="ApplicationCommands.Find"/>
                <MouseBinding MouseAction="LeftClick" Command="ApplicationCommands.Find"/>
            </Button.InputBindings>
        </Button>
    </Grid>
</Window>


MainWindow.xaml.cs

namespace Commands_Xaml
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();            
            //ApplicationCommands.Find.InputGestures.Add(new KeyGesture(Key.F,ModifierKeys.Control));
            //ApplicationCommands.Find.InputGestures.Add(new MouseGesture(MouseAction.LeftClick));

            //CommandBinding bindingObject = new CommandBinding();
            //bindingObject.Command = ApplicationCommands.Find;
            //bindingObject.Executed += new ExecutedRoutedEventHandler(CommandBinding_Executed);
            //this.CommandBindings.Add(bindingObject);
        }

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

1 ответ

Переместите привязку команды / ввода к уровню окна и используйте свойство Command кнопки вместо попытки использовать MouseBinding.

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Find" Executed="CommandBinding_Executed" />
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Command="ApplicationCommands.Find" Key="F" Modifiers="Control" />
    </Window.InputBindings>

    <Grid>
        <Button Command="ApplicationCommands.Find" Content="Button" HorizontalAlignment="Left" Margin="206,152,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window>

ОБНОВИТЬ

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

Используйте разные команды для каждой кнопки:

<Button Command="ApplicationCommands.Find" Content="Button1" />
<Button Command="ApplicationCommands.Print" Content="Button2" />

Используйте CommandParameter:

<Button Command="ApplicationCommands.Find" CommandParameter="Find1" Content="Button1" />
<Button Command="ApplicationCommands.Find" CommandParameter="Find2" Content="Button2" />

И для связывания ключей:

<KeyBinding Command="ApplicationCommands.Find" CommandParameter="Find3" />

Вы можете получить доступ к этому свойству в обработчике CommandBinding.Executed:

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    if (e.Parameter as string == "Find1")
    {
        //Find1
    }
    else if (e.Parameter as string == "Find2")
    {
        //Find2
    }    
    else if (e.Parameter as string == "Find3")
    {
        //Find3
    }
}
Другие вопросы по тегам