我的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;
}
}
答案 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就是其中之一。