2009-05-30 2 views
9

Конструктор RoutedCommand имеет «тип владельца» в качестве последнего аргумента. Каково его значение? Когда он используется?Какое использование имеет аргумент владельца конструктора класса RoutedCommand?

MSDN документация полностью не дает ни малейшего понятия о том, почему это необходимо, и могу ли я использовать один тип для всех команд

Цитаты из MSDN

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

Существует еще одна вещи. Какой тип я должен использовать при динамическом создании новых маршрутизируемых команд из массива имен. Похоже, что любой тип работает, поэтому я использую UIElement, но если для этого есть более подходящий тип, я бы хотел знать.

ответ

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

Любой может объяснить, почему? –

+2

Наверное, просто «потому что». Хорошая причина для дизайна API, как и любой другой. * blech * –

3

Я знаю, что это очень старый вопрос, но это топ поиска хит для «RoutedCommand ownertype».

Сохранение типа владельца и имени внутри каждого объекта RoutedCommand дает вам подсказку о том, как найти ссылки на него в коде. Предположим, что вы используете отладчик для некоторого метода, который имеет произвольный параметр ICommandSource. Вы можете проверить свойство Command, и если вы увидите, что OwnerType - CommonCommands, а Name - "DoSomething", вы можете перейти в поле DoSomething класса CommonCommands, где может быть полезный комментарий или искать ссылки на CommonCommands.DoSomething, чтобы найти связанные CommandBindings или что-то. Без этих свойств RoutedCommand будет просто анонимным объектом.

Я не знаю, имела ли смысл то, что разработчики API действительно имели в виду, когда они включали в себя аргумент, но это было полезно для меня, по крайней мере.

+0

Значит, это не имеет никакого эффекта? Это просто для «документации»? –

+0

@ScottStafford У этого есть цель. Если вы посмотрите на комментарий denis philips, частный метод GetInputGestures загрузит введенные жесты для встроенных команд. Я бы предположил, что они все еще публично раскрывают это, чтобы вы назначили тип, который их внутренний код отвергает. – NWoodsman

Смежные вопросы