WPF中的命令路由的4个主要的概念:命令、命令源、命令目标、命令绑定。
命令:WPF中的命令实现ICommand接口,公开了两个方法一个事件。分别是:Excute、CanEXcute、CanExecuteChanged。Execute执行与命令相关联的操作。CanExecute确认是否可以在当前命令目标上执行命令。如果命令管理器检测到命令源发生了更改,次更改可能会使得已引发但尚未有命令绑定执行的命令无效。则将引发CanExecuteChanged。ICOmmand的WPF实现的是RoutedCommand类。RoutedCommand上的Execute方法在命令目标上引发previewCanExecuted和CanExecute事件,这些时间沿着元素树以隧道忽然冒泡的形式传递。直到遇到有特定命令的CommandBinding对象。WPF提供了一组常用的路由命令,这些路由命令分别属于一下几个类。
ApplactionCommands、NavigationCommand、ComponmentCommand、EditingCommands、MediaCommands这几个类仅仅包含RoutedCommand对象,而不包含命令的实现逻辑。实现逻辑又其上执行命令的对象负责。
以下是WPF已经封装好的命令:
ApplactionCommands |
copy、close、cut、pause、save、print |
MediaCommands |
Play、pause、NextTrack、IncreaseVolum、 Record、Stop |
NavigationCommands | BrowseForward、BrowseBack、Zoom、Search |
EditingCommands | AlginXXX、MoveXXX、selectXXX |
ComponmentCommands | MoveXXX、SelectXXX、ScrollXXX、ExtendSelection |
其中XXX代表操作集合,例如MoveNext、MovePrevious。其中ApplactionCommands为默认的命令类,引用其中的命令时可以省略。
命令源:调用命令的对象MenuItem、Button、KeyGesture。WPF中的命令源通常实现ICommandSource接口。ICommandSource公开3个属性Command、CommandTarget、CommandParaeter。 command是调用命令源时执行的命令。commandTarget是要在其上执行命令的对象(注意:ICommandSource上的CommandTarget只有在ICommand是RoutedCommand时才有效。如果ICommandSource上设置了CommandTarget而对应的命令不是RoutedCommand,将会忽略命令目标,如果未设置CommandTarget则具有键盘输入焦点的元素将是命令目标)。CommandParaeter是用户定义的数据类型,用于将信息传递到实现命令的处理程序。
实现ICommandSource的WPF类包括ButtonBase、MenuItem、HyperLink、InputBinding。 ButtonBase、MenuItem、HyperLink在被单机时调用命令,并却直接使用控件的command属性绑定命令。InputBinding在与之关联的inputGesture执行时调用,并且使用KeyBinding、MouseBinding绑定某一特定的输入手势到某一命令上。