2012-06-23 11 views
19

Was ist der Unterschied zwischen:Wann ist {x: Type ...} zu verwenden?

<Style TargetType="{x:Type Border}"> 

und:

<Style TargetType="Border"> 

Wann und warum muss ich die {x:Type …} benutzen?

+1

+1 gute Frage. Meine Vermutung wäre, dass die zweite eine neue, verbesserte Notation ist. – McGarnagle

+3

Ähnliche alte SO-Fragen - http://StackOverflow.com/Questions/1085730/Difference-between-TargetType-ControlType-and-TargetType-Xtype-ControlType/9128422#9128422 und http://StackOverflow.com/Questions/ 5449481/performance-diff-between-target-something-and-target-xtype-something/9127377 # 9127377 – akjoshi

Antwort

11

Es gibt keinen Unterschied in der Wirkung; In beiden Fällen wird die Targettype-Eigenschaft auf typeof(Border)

Die erste Version {x:Type Border} benötigt wurde in der ersten Version von WPF eingestellt werden, da der Compiler nicht die TypeConverter Klasse verwendet haben die Zeichenfolge in ein Type-Objekt zu konvertieren und Sie benötigt die angeben TypeExtension Klasse, um das für Sie zu tun.

Die zweite Version wurde, wenn ich mich richtig erinnere, mit Silverlight eingeführt und fand schnell ihren Weg zum WPF Compiler.

EDIT

Meine Vermutung auf der TypeConverter Klasse war falsch; dies wird durch die FrameworkElementFactory implementiert:

Von the documentation:

Typ-Eigenschaften, dass die Unterstützung Type-Name-as-String

WPF unterstützt Techniken, die den Wert von einigen Eigenschaften des Typs Typ ermöglichen die Angabe ohne ein x zu erfordern: Geben Sie Markup-Erweiterung Verwendung. Stattdessen können Sie den Wert als Zeichenfolge mit dem Namen angeben. Beispiele hierfür sind ControlTemplate.TargetType und Style.TargetType. Unterstützung für dieses Verhalten wird nicht durch entweder Typkonverter oder Markuperweiterungen bereitgestellt. Stattdessen handelt es sich um ein Deferral-Verhalten , das über FrameworkElementFactory implementiert wird.

Silverlight unterstützt eine ähnliche Konvention. Tatsächlich unterstützt Silverlight derzeit nicht die Unterstützung für {x: Type} in der XAML-Sprache. akzeptiert die Verwendung von {x: Type} nicht unter den folgenden Umständen , die WPF-Silverlight XAML-Migration unterstützen sollen. Daher ist das Typname-as-string-Verhalten in allen Silverlight-Eigenschaftsauswertung integriert, wo ein Typ der Wert ist.

1

Beide sind genau gleich. In beiden Fällen gilt Ihr Stil nur für Border.

2

Wenn Sie diese Eigenschaft (TargetType) auf Border setzen, ohne dem Stil eine x:Key zuzuweisen, kann der Stil auf alle Border-Elemente angewendet werden. Aber wenn Sie die x:Key auf {x:Type Border} setzen, bedeutet dies, dass wenn Sie Style einen x:Key Wert von etwas anderem als {x:Type Border} geben, die Style nicht automatisch auf alle Border-Elemente angewendet würde. Stattdessen müssen Sie den Stil explizit auf die Border-Elemente anwenden.

4

Obwohl es in dem gegebenen Beispiel keinen Unterschied gibt, gibt es tatsächlich einen Unterschied zwischen x:Type und TypeName-as-String.

ich begegnet kürzlich eine Situation, die zeigt, dass x:Type von TypeName-as-String unterscheidet, wenn es um benutzerdefinierte Typen kommt. Aus meiner Erfahrung -

x:Type hält der starke Name oder die Version der Assembly (in der Art liegt), aber nicht TypeName-as-String.

ich über mein Szenario und andere Details in meinem Blog hier erklärt haben -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

Abgesehen davon gibt es auch Unterschied, wie WPF den Typ folgert. Für wird x:TypeTypeExtension verwendet, wobei für TypeName-as-StringFrameworkElementFactory verwendet wird (wie Erno erwähnt).

0

Wenn Sie XAML 2009 verwenden, kann x: Key als ein Element angegeben werden, um explizit Wörterbücher zu unterstützen, die durch andere Objekttypen als Strings codiert sind, ohne eine Markup-Erweiterung zu benötigen. Siehe Abschnitt "XAML 2009" in diesem Thema. Der Rest des Abschnitts "Hinweise" bezieht sich speziell auf die XAML 2006-Implementierung.

Der Attributwert von x: Key kann eine beliebige in der XamlName-Grammatik definierte Zeichenfolge sein oder ein Objekt sein, das über eine Markuperweiterung ausgewertet wird. Ein Beispiel von WPF finden Sie unter "WPF-Verwendungshinweise".

Untergeordnete Elemente eines übergeordneten Elements, bei dem es sich um eine IDictionary-Implementierung handelt, müssen normalerweise ein x: Key-Attribut enthalten, das einen eindeutigen Schlüsselwert in diesem Wörterbuch angibt. Frameworks könnten Alias-Schlüsseleigenschaften implementieren, um x: Schlüssel für bestimmte Typen zu ersetzen. Typen, die solche Eigenschaften definieren, sollten DictionaryKeyPropertyAttribute zugeordnet werden.

Der Code entspricht der Angabe von x: Schlüssel ist der Schlüssel, der für das zugrunde liegende IDictionary verwendet wird. Ein x: Schlüssel, der in Markup für eine Ressource in WPF angewendet wird, entspricht beispielsweise dem Wert des Schlüsselparameters von ResourceDictionary.Add, wenn Sie die Ressource einem WPF ResourceDictionary im Code hinzufügen. Die Markuperweiterung x: Type hat eine ähnliche Funktion wie der Operator typeO in C# oder der Operator GetType in Microsoft Visual Basic.

Die x: Type-Markuperweiterung liefert ein Verhalten zur Umwandlung von Zeichenfolgen für Eigenschaften, die den Typ Typ annehmen. Die Eingabe ist ein XAML-Typ. Die Beziehung zwischen dem XAML-Eingabetyp und dem CLR-Ausgabetyp besteht darin, dass der Ausgabetyp der UnderlyingType des XamlType-Eingangs ist, nachdem der erforderliche XamlType auf der Grundlage des XAML-Schemakontexts und des vom Kontext bereitgestellten IXamlTypeResolver-Dienstes gesucht wurde.

In .NET Framework XAML-Dienste wird die Behandlung für diese Markup-Erweiterung von der TypeExtension-Klasse definiert.

In bestimmten Framework-Implementierungen können einige Eigenschaften, die Type als Wert annehmen, den Namen des Typs direkt akzeptieren (den String-Wert des Typs Name). Das Implementieren dieses Verhaltens ist jedoch ein komplexes Szenario. Beispiele finden Sie im folgenden Abschnitt "WPF-Verwendungshinweise".

Attributsyntax ist die am häufigsten verwendete Syntax für diese Markuperweiterung. Das nach der x: Type-Bezeichnerzeichenfolge angegebene Zeichenfolgetoken wird als TypeName-Wert der zugrunde liegenden TypeExtension-Erweiterungsklasse zugewiesen. Im Standardkontext für XAML-Schemas für .NET Framework XAML Services, der auf CLR-Typen basiert, ist der Wert dieses Attributs entweder der Name des gewünschten Typs oder enthält den Namen, dem ein Präfix für eine nicht standardmäßige XAML-Namespacezuordnung vorangestellt ist .

Die x: Type-Markuperweiterung kann in der Syntax von Objektelementen verwendet werden. In diesem Fall muss der Wert der Eigenschaft TypeName angegeben werden, damit die Erweiterung ordnungsgemäß initialisiert wird.

Die x: Type-Markuperweiterung kann auch als ausführliches Attribut verwendet werden; jedoch ist diese Verwendung nicht typisch:

+4

Wenn Sie einen Test kopieren, sollten Sie einen Link angeben und/oder einen Kredit geben. –

+0

Strg + C, Strg + V erkannt :) –