11

RoutedCommand 的构造函数将“所有者类型”作为最后一个参数。它的意义是什么?什么时候使用?

MSDN 文档完全不知道为什么需要它以及我是否可以对所有命令使用一种类型

引用自 MSDN

ownerType
     Type: System.Type The type
     which is registering the command.

还有一件事。从名称数组动态创建新的路由命令时应该使用什么类型。看起来任何类型都有效,所以我使用的是 UIElement,但如果有更适合的类型,我想知道。

4

2 回答 2

6

RoutedCommand 的源代码显示该类型成为 OwnerType 属性。在获取 InputGestures 时,最终会通过以下私有方法查询该属性。因此,看起来这种类型似乎被用于根据创建 RoutedCommand 的类型来查找(硬编码的)命令集。

private InputGestureCollection GetInputGestures()
{
    if (this.OwnerType == typeof(ApplicationCommands))
{
    return ApplicationCommands.LoadDefaultGestureFromResource(this._commandId);
}
if (this.OwnerType == typeof(NavigationCommands))
{
    return NavigationCommands.LoadDefaultGestureFromResource(this._commandId);
}
if (this.OwnerType == typeof(MediaCommands))
{
    return MediaCommands.LoadDefaultGestureFromResource(this._commandId);
}
if (this.OwnerType == typeof(ComponentCommands))
{
    return ComponentCommands.LoadDefaultGestureFromResource(this._commandId);
}
return new InputGestureCollection();
}
于 2009-05-30T19:15:46.843 回答
4

我知道这是一个非常古老的问题,但它是“routedcommand ownertype”的热门搜索。

在每个 RoutedCommand 对象中存储 OwnerType 和 Name 可以提示您如何在代码中查找对它的引用。假设您在某个具有任意ICommandSource参数的方法上运行调试器。您可以检查 Command 属性,如果您看到 OwnerType 是CommonCommands并且 Name 是"DoSomething",您可以导航到 CommonCommands 类的 DoSomething 字段,其中可能有有用的注释,或者搜索对CommonCommands.DoSomething以查找关联的 CommandBindings 或其他内容的引用。如果没有这些属性,RoutedCommand 将只是一个匿名对象。

我不知道这个原因是否是 API 设计者在加入这个论点时真正想到的,但至少它对我有用。

于 2013-07-17T16:54:50.290 回答