复制/粘贴键绑定不起作用

时间:2012-01-17 14:48:26

标签: c# wpf xaml copy-paste key-bindings

我的MainWindow中有以下键绑定:

<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 个答案:

答案 0 :(得分:3)

您只能执行CanExecute返回true的命令,这可能是他们不执行的原因之一。

另一个可能的原因是本地处理相应的手势,默认为TextBoxes。您可以通过使用自己的命令在本地重新声明KeyBindings来覆盖它。

答案 1 :(得分:1)

这很好用。在我的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;
    }
}

当我执行时,它工作正常。您可以在控制台中查看已执行的命令。 请告诉我,如果我错过了什么。

答案 2 :(得分:0)

由于Windows已经使用它们,因此您无法使用某些组合键。我认为Ctrl + c / v就是其中之一。