我建立使用CAL /棱镜复合应用程序。 主区域是一个选项卡控制,具有多种类型的视图中它。 每个视图具有一组自定义命令,它可以处理它们在窗口的顶部结合的工具栏按钮。 我以前在非CAL的应用程序通过简单的设置请在命令中InputBinding做到了这一点,但我一直没能找到的CAL模块的源代码,任何这样的机制。
我的问题是,什么是挂钩击键我认为最好的方式,这样当用户按下Alt + T 键 ,相关DelegateCommand对象处理它? 挂钩的快捷方式不能说难...
我建立使用CAL /棱镜复合应用程序。 主区域是一个选项卡控制,具有多种类型的视图中它。 每个视图具有一组自定义命令,它可以处理它们在窗口的顶部结合的工具栏按钮。 我以前在非CAL的应用程序通过简单的设置请在命令中InputBinding做到了这一点,但我一直没能找到的CAL模块的源代码,任何这样的机制。
我的问题是,什么是挂钩击键我认为最好的方式,这样当用户按下Alt + T 键 ,相关DelegateCommand对象处理它? 挂钩的快捷方式不能说难...
该MVVM工具包有一个叫做类CommandReference
,让你使用一个参考的命令作为键绑定。
<Window ...
xmlns:toolkit="clr-namespace:CannotRememberNamspace;assembly=OrTheAssembly"
>
<Window.Resources>
<toolkit:CommandReference
x:Key="ExitCommandReference"
Command="{Binding ExitCommand}" />
</Window.Resources>
<Window.InputBindings>
<KeyBinding Key="X"
Modifiers="Control"
Command="{StaticResource ExitCommandReference}" />
</Window.InputBindings>
</Window>
这会做到这一点。
编辑:由于这是书面的,WPF 4.0修正了这个特定的问题,您不再需要使用静态资源的解决方法。 您可以在您的视图模型直接从键绑定引用命令。
仅供参考类目前不包括在你可以引用组装,而是包含在MV-VM项目模板。 所以,如果你不从模板构建应用程序,那么你必须从其他地方得到的类。 我选择了它从样本项目复制。 我包括它下面让大家方便地访问善良的这个小块,但一定要检查在MV-VM工具包的未来版本更新的模板。
/// <summary>
/// This class facilitates associating a key binding in XAML markup to a command
/// defined in a View Model by exposing a Command dependency property.
/// The class derives from Freezable to work around a limitation in WPF when data-binding from XAML.
/// </summary>
public class CommandReference : Freezable, ICommand
{
public CommandReference( )
{
}
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( "Command", typeof( ICommand ), typeof( CommandReference ), new PropertyMetadata( new PropertyChangedCallback( OnCommandChanged ) ) );
public ICommand Command
{
get { return (ICommand)GetValue( CommandProperty ); }
set { SetValue( CommandProperty, value ); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
if (Command != null)
return Command.CanExecute( parameter );
return false;
}
public void Execute(object parameter)
{
Command.Execute( parameter );
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CommandReference commandReference = d as CommandReference;
if (commandReference != null)
{
ICommand oldCommand = e.OldValue as ICommand;
if (oldCommand != null)
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
ICommand newCommand = e.NewValue as ICommand;
if (newCommand != null)
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore( )
{
return new CommandReference();
}
#endregion
}
请享用!
看看这些文章: http://coderscouch.com/tags/input%20bindings 。 他们应该是有帮助的。