Копирование / вставка связок клавиш не работает


У меня есть следующие привязки клавиш в моем главном окне:

<KeyBinding Command="{Binding OpenCommand}" Gesture="Ctrl+O"/>
<KeyBinding Command="{Binding SaveCommand}" Gesture="Ctrl+S"/>

<KeyBinding Command="{Binding CopyCommand}" Gesture="Ctrl+C"/>
<KeyBinding Command="{Binding PasteCommand}" Gesture="Ctrl+V"/>
<KeyBinding Command="{Binding CutCommand}" Gesture="Ctrl+X"/>

И сохранить комбинации клавиш работают нормально... остальные ничего не делают, когда я нажимаю комбинацию клавиш. В выходных данных нет ошибок привязки. У меня также есть кнопки в меню, связанные с теми же командами, и они работают. Существует ли проблема с использованием команд, имеющих метод CanExecute, связанный с ними? Я использую .Net 4.0. Есть идеи, почему действия буфера обмена не будут работать?

Обновление: Если я свяжу что-то еще (например, OpenCommand) для Ctrl+C это работает. Если я привяжу подражание к другому жесту, это все равно не сработает. Так что, похоже, это проблема с командой. Хотя это странно, потому что моя кнопка копирования отлично работает, привязанная к той же команде копирования. Вот код подражания, к которому он привязан:

public ICommand CopyCommand
    {
        get
        {
            if (this.copyCommand == null)
            {
                this.copyCommand = new RelayCommand(
                    param => this.Copy(),
                    param => this.Copy_CanExecute());
            }

            return this.copyCommand;
        }
    }
3 4

3 ответа:

Вы можете выполнять только команды, где CanExecute возвращает true, может быть одной из причин, почему они не выполняются.

Другой возможной причиной является локальная обработка соответствующих жестов, как это делается по умолчанию. Вы можете переопределить это, повторно объявив KeyBindings локально с помощью своей собственной команды.

Это прекрасно работает. В моем главном окне.xaml-файл, я добавляю две команды привязки клавиш для иллюстрации

<Window x:Class="MainWindowCommandBinding.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.InputBindings>
        <KeyBinding Command="{Binding OpenCommand}" Gesture="Ctrl+O"/>
        <!--<KeyBinding Command="{Binding SaveCommand}" Gesture="Ctrl+S"/>-->
        <KeyBinding Command="{Binding CopyCommand}" Gesture="Ctrl+C"/>
        <!--<KeyBinding Command="{Binding PasteCommand}" Gesture="Ctrl+V"/>
        <KeyBinding Command="{Binding CutCommand}" Gesture="Ctrl+X"/>-->
    </Window.InputBindings>
    <Grid>

    </Grid>
</Window>

В моем главном окне.код XAML.cs-файл, я инициализирую свой DataContext следующим образом.

  public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowContext();
    }

Класс MainWindowContext определяется следующим образом

class MainWindowContext
{
    RelayCommand _openCommand;
    public ICommand OpenCommand
    {
        get
        {
            if (_openCommand == null)
            {
                _openCommand = new RelayCommand(
                    param => this.Open(),
                    param => this.Open_CanExecute());
            }
            return _openCommand;
        }

        set { _openCommand = (RelayCommand) value; }

    }

    RelayCommand _copyCommand;
    public ICommand CopyCommand
    {
        get
        {
            if (_copyCommand == null)
            {
                _copyCommand = new RelayCommand(
                    param => this.Copy(),
                    param => this.Copy_CanExecute());
            }
            return _copyCommand;
        }

        set { _copyCommand = (RelayCommand)value; }

    }

    private bool Copy_CanExecute()
    {
        return true;
    }

    private object Copy()
    {
        Console.Out.WriteLine("Copy command executed");
        return null;
    }

    private bool Open_CanExecute()
    {
        return true;
    }

    private object Open()
    {
        Console.Out.WriteLine("Open command executed");
        return null;
    }
}

Когда я выполняю, это работает нормально. Вы можете видеть, какая команда была выполнена в вашей консоли. Пожалуйста, скажите мне, если я что-то упущу.

Есть некоторые комбинации клавиш, которые вы не можете использовать, потому что windows уже использует их. Я думаю, Ctrl+c/v - один из них.