2009-05-30 16 views
9

El constructor de RoutedCommand tiene "owner type" como último argumento. ¿Cuál es su significado? Cuando se usa?¿Qué uso tiene el argumento de ownertype del constructor de clase RoutedCommand?

documentación de MSDN da por completo ninguna pista acerca de por qué se necesita y si podría utilizar un tipo para todos los comandos

Presupuesto de MSDN

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

Hay una cosa más. ¿Qué tipo de uso debo usar al crear nuevos comandos enrutados dinámicamente a partir de una matriz de nombres? Parece que cualquier tipo funciona, así que estoy usando UIElement, pero si hay un tipo más apropiado para esto, me gustaría saberlo.

Respuesta

6

La fuente de RoutedCommand muestra que el tipo se convierte en la propiedad OwnerType. Esta propiedad se consulta en última instancia mediante el siguiente método privado al obtener InputGestures. Por lo tanto, parece que este tipo se utiliza para buscar un conjunto de Comandos (codificados) según el tipo que creó el 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

¿Alguien puede explicar por qué? –

+2

Probablemente solo "porque" Como una buena razón para el diseño de API como cualquier otro. * blech * –

3

Sé que esto es una pregunta muy antigua, pero es la búsqueda de la parte superior para golpear "OWNERTYPE RoutedCommand".

Almacenar un OwnerType and Name dentro de cada objeto RoutedCommand le da una pista sobre cómo encontrar referencias en el código. Supongamos que está ejecutando el depurador en algún método que tiene un parámetro arbitrario ICommandSource. Puede examinar la propiedad Command, y si ve que OwnerType es CommonCommands y Name es "DoSomething", puede navegar hasta el campo DoSomething de la clase CommonCommands, donde puede haber un comentario útil, o buscar referencias al CommonCommands.DoSomething para encontrar los CommandBindings asociados. o algo. Sin esas propiedades, RoutedCommand sería solo un objeto anónimo.

No sé si ese fue el motivo por el que los diseñadores de la API realmente tenían en mente cuando incluyeron el argumento, pero al menos me ha resultado útil.

+0

¿Entonces no tiene ningún efecto? ¿Es solo para "documentación"? –

+0

@ScottStafford Tiene un propósito. Si miras el comentario de denis philips, el método privado 'GetInputGestures' carga los gestos de entrada para los comandos incorporados. Asumiría que todavía exponen públicamente esto para que asigne un tipo que su código interno rechaza. – NWoodsman

Cuestiones relacionadas