2012-01-17 64 views
4

我在我的主窗口下面的按键绑定:复制/粘贴键绑定不工作

<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; 
     } 
    } 
+0

如果你将CopyCommand等绑定到另一个手势,他们的工作? – Arcass

+0

如果我将另一个命令绑定到Ctrl + C,它会起作用,如果我将CopyCommand绑定到另一个手势,则不起作用。所以这与命令有关。我将添加该命令的代码。似乎很奇怪,因为复制按钮我工作正常。 – KrisTrip

回答

3

您只能执行命令,其中CanExecute返回true,可能是他们不执行任何操作的原因之一。

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

+0

CanExecute返回true(我可以告诉,因为我的按钮,也绑定到该命令启用和禁用正确)。 – KrisTrip

+0

@KrisTrip:也许命令是在别的地方处理的?例如一个TextBox可能会覆盖所述的“KeyBindings”。 –

+0

哦好打电话,我试图复制的东西是一个TextBox(只读)在一个树视图。有什么方法可以禁用TextBox? – KrisTrip

0

有一些你不能使用的组合键,因为windows已经使用它们。我认为Ctrl + c/v就是其中之一。

+0

这是不正确的... –

1

这工作正常。在我MainWindow.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> 

2个键绑定命令,在我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; 
    } 
} 

当我执行,它工作正常。你可以看到你的控制台已经执行了哪个命令。 请告诉我,如果我错过了什么。