Копирование / вставка сочетаний клавиш не работает - PullRequest
4 голосов
/ 17 января 2012

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

<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, это работает. Если я связываю CopyCommand с другим жестом, он все равно не работает. Так что, похоже, проблема с командой. Это странно, потому что моя кнопка копирования прекрасно работает с той же CopyCommand. Вот код CopyCommand, с которым он связан:

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

            return this.copyCommand;
        }
    }

Ответы [ 3 ]

3 голосов
/ 17 января 2012

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

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

1 голос
/ 17 января 2012

это работает нормально. В моем файле MainWindow.xaml я добавляю две команды keyBinding для иллюстрации

<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>

В моем файле MainWindow.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;
    }
}

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

0 голосов
/ 17 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...