2009-05-30 8 views
9

Der Konstruktor des RoutedCommand hat als letztes Argument "Owner Type". Was ist seine Bedeutung? Wann wird es verwendet?Welchen Nutzen hat RoutedCommand 'class constructor ownertype Argument?

MSDN-Dokumentation gibt absolut keine Ahnung, warum es nötig ist und ob ich eine Art verwenden könnte für alle

Zitat von MSDN-Befehle

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

Es gibt eine weitere Sache. Welchen Typ sollte ich beim dynamischen Erstellen neuer Routing-Befehle aus einem Array von Namen verwenden? Es sieht so aus, als ob jeder Typ funktioniert, also verwende ich UIElement, aber wenn es einen geeigneteren Typ dafür gibt, würde ich gerne wissen.

Antwort

6

Die Quelle für RoutedCommand zeigt, dass der Typ die OwnerType-Eigenschaft wird. Diese Eigenschaft wird beim Abrufen von InputGestures letztlich von der folgenden privaten Methode abgefragt. Es sieht also so aus, als ob dieser Typ verwendet wird, um einen (fest codierten) Befehlssatz basierend auf dem Typ zu suchen, der den RoutedCommand erstellt hat.

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

Jeder kann erklären warum? –

+2

Wahrscheinlich nur "weil". Ein guter Grund für das API-Design. * blech * –

3

Ich weiß, dass dies eine sehr alte Frage, aber es ist der Top-Suchtreffer für „RoutedCommand Ownertype“.

Wenn Sie einen OwnerType und einen Namen in jedem RoutedCommand-Objekt speichern, erhalten Sie einen Hinweis darauf, wie Sie im Code Referenzen darauf finden. Angenommen, Sie führen den Debugger für eine Methode mit einem beliebigen ICommandSource-Parameter aus. Sie können die Command-Eigenschaft untersuchen. Wenn Sie sehen, dass OwnerType CommonCommands und Name "DoSomething" ist, können Sie zum DoSomething-Feld der CommonCommands-Klasse navigieren, wo ein nützlicher Kommentar vorhanden sein kann, oder nach Referenzen auf CommonCommands.DoSomething suchen, um die zugehörigen CommandBindings zu finden oder so. Ohne diese Eigenschaften wäre der RoutedCommand einfach ein anonymes Objekt.

Ich weiß nicht, ob dieser Grund war, was die API-Designer tatsächlich im Hinterkopf hatten, als sie das Argument einschlossen, aber es war mir zumindest nützlich.

+0

Also hat es überhaupt keinen Effekt? Es ist nur für "Dokumentation"? –

+0

@ScottStafford Es hat einen Zweck. Wenn Sie sich den Denis-Philips-Kommentar ansehen, lädt die private Methode 'GetInputGestures' die Eingabegesten für die eingebauten Befehle. Ich nehme an, dass sie dies noch öffentlich offen legen, so dass Sie einen Typ zuweisen, den ihr interner Code ablehnt. – NWoodsman

Verwandte Themen