Omówienie rozszerzeń znaczników dla języka XAMLOverview of markup extensions for XAML

Rozszerzenia znaczników są techniką języka XAML do uzyskiwania wartości, która nie jest pierwotna lub określonego typu XAML.Markup extensions are a XAML technique for obtaining a value that's not a primitive or a specific XAML type. W przypadku użycia atrybutów rozszerzenia znaczników używają znanej sekwencji znaków otwierającego nawiasu klamrowego { , aby wprowadzić zakres rozszerzenia znacznika i zamykającego nawiasu klamrowego } .For attribute usage, markup extensions use the known character sequence of an opening curly brace { to enter the markup extension scope, and a closing curly brace } to exit. W przypadku korzystania z usług języka XAML platformy .NET można użyć niektórych wstępnie zdefiniowanych rozszerzeń znaczników języka XAML z zestawu System. XAML.When using .NET XAML Services, you can use some of the predefined XAML language markup extensions from the System.Xaml assembly. Można również utworzyć podklasę z MarkupExtension klasy, zdefiniowanej w pliku System. XAML i zdefiniować własne rozszerzenia znaczników.You can also subclass from the MarkupExtension class, defined in System.Xaml, and define your own markup extensions. Lub można użyć rozszerzeń znaczników zdefiniowanych przez określoną strukturę, jeśli już odwołujesz się do tej struktury.Or you can use markup extensions defined by a particular framework if you are already referencing that framework.

Po uzyskaniu dostępu do rozszerzenia znaczników moduł zapisujący obiektów XAML może dostarczać usługi do niestandardowej MarkupExtension klasy za pomocą punktu połączenia usługi w MarkupExtension.ProvideValue przesłonięciu.When a markup extension usage is accessed, the XAML object writer can provide services to a custom MarkupExtension class through a service connection point in the MarkupExtension.ProvideValue override. Usługi mogą służyć do uzyskania kontekstu dotyczącego użycia, określonych możliwości składnika zapisywania obiektów, kontekstu schematu XAML i tak dalej.The services can be used to obtain context about the usage, specific capabilities of the object writer, XAML schema context, and so on.

Rozszerzenia znaczników zdefiniowane w języku XAMLXAML-defined markup extensions

Usługa .NET XAML obsługuje kilka rozszerzeń znaczników do obsługi języka XAML.Several markup extensions are implemented by .NET XAML Services for XAML language support. Te rozszerzenia znaczników odpowiadają części specyfikacji języka XAML jako języka.These markup extensions correspond to parts of the specification of XAML as a language. Są one zazwyczaj identyfikowane przez x: prefiks w składni, jak pokazano w typowym użyciu.These are typically identifiable by the x: prefix in the syntax as seen in common usage. Implementacje usług .NET XAML dla tych elementów języka XAML wszystkie pochodzą od MarkupExtension klasy bazowej..NET XAML Services implementations for these XAML language elements all derive from the MarkupExtension base class.

Uwaga

x:Prefiks jest używany dla typowego mapowania przestrzeni nazw XAML w przestrzeni nazw języka XAML, w elemencie głównym produkcji XAML.The x: prefix is used for the typical XAML namespace mapping of the XAML language namespace, in the root element of a XAML production. Na przykład szablon projektu i strony programu Visual Studio dla różnych określonych platform inicjują plik XAML przy użyciu tego x: mapowania.For example, the Visual Studio project and page templates for various specific frameworks initiate a XAML file using this x: mapping. Można wybrać inny token prefiksu w ramach własnego mapowania przestrzeni nazw XAML, ale w tej dokumentacji założono domyślne x: Mapowanie jako środek identyfikacji tych jednostek, które są zdefiniowaną częścią przestrzeni nazw XAML języka XAML, w przeciwieństwie do domyślnej przestrzeni nazw XAML lub innych dowolnych przestrzeni nazw CLR lub XML.You could choose a different prefix token in your own XAML namespace mapping, but this documentation will assume the default x: mapping as a means of identifying those entities that are a defined part of the XAML language XAML namespace, as opposed to a specific framework's default XAML namespace or other arbitrary CLR or XML namespaces.

X:Type —x:Type

x:Type dostarcza Type obiekt dla nazwanego typu.x:Type supplies the Type object for the named type. Ta funkcja jest używana najczęściej w przypadku mechanizmów odroczenia, które używają podstawowego typu CLR i wyprowadzania typu jako moniker lub identyfikator grupowania.This functionality is used most frequently in deferral mechanisms that use underlying CLR type and type derivation as a grouping moniker or identifier. Przykładem są style i szablony WPF oraz ich użycie TargetType właściwości.WPF styles and templates, and their usage of TargetType properties, are a specific example. Aby uzyskać więcej informacji, zobacz X:Type — Markup Extension.For more information, see x:Type Markup Extension.

X:static —x:Static

x:Static tworzy wartości statyczne z jednostek kodu typu wartości, które nie są bezpośrednio typem wartości właściwości, ale można je ocenić dla tego typu.x:Static produces static values from value-type code entities that are not directly the type of a property's value, but can be evaluated to that type. Jest to przydatne w przypadku określania wartości, które już istnieją jako dobrze znanych stałych w definicji typu.This is useful for specifying values that already exist as well-known constants in a type definition. Aby uzyskać więcej informacji, zobacz X:Static — Markup Extension.For more information, see x:Static Markup Extension.

X:null —x:Null

x:Null Określa null jako wartość dla elementu członkowskiego języka XAML.x:Null specifies null as a value for a XAML member. W zależności od projektu określonych typów lub większych pojęć związanych z platformą, null nie zawsze jest wartością domyślną dla właściwości lub wartością implikowaną pustego atrybutu ciągu.Depending on the design of specific types or on larger framework concepts, null is not always a default value for a property, or the implied value of an empty string attribute. Aby uzyskać więcej informacji, zobacz X:null — Markup Extension.For more information, see x:Null Markup Extension.

x:Arrayx:Array

x:Array obsługuje tworzenie ogólnych tablic w składni języka XAML w przypadkach, gdy obsługa kolekcji, która jest dostarczana przez elementy podstawowe i modele kontroli, nie jest świadomie używana.x:Array supports creation of general arrays in XAML syntax in cases where the collection support that is provided by base elements and control models is deliberately not used. Aby uzyskać więcej informacji, zobacz X:Array Markup Extension.For more information, see x:Array Markup Extension. W języku XAML 2009 w szczególnych przypadkach tablice są dostępne jako elementy podstawowe języka, a nie jako rozszerzenia.In XAML 2009 specifically, arrays are accessed as language primitives instead of as an extension. Aby uzyskać więcej informacji, zobacz funkcje języka XAML 2009.For more information, see XAML 2009 Language Features.

X:Reference —x:Reference

x:Reference jest częścią XAML 2009, rozszerzenie oryginalnego zestawu językowego (2006).x:Reference is part of XAML 2009, an extension of the original (2006) language set. x:Reference reprezentuje odwołanie do innego istniejącego obiektu w grafie obiektów.x:Reference represents a reference to another existing object in an object graph. Ten obiekt jest identyfikowany przez jego x:Name .That object is identified by its x:Name. Aby uzyskać więcej informacji, zobacz X:Reference — Markup Extension.For more information, see x:Reference Markup Extension.

Inne elementy x: KonstrukcjeOther x: Constructs

x:Istnieją inne konstrukcje obsługujące funkcje języka XAML, ale nie są one zaimplementowane jako rozszerzenia znaczników.Other x: constructs to support XAML language features exist, but these are not implemented as markup extensions. Aby uzyskać więcej informacji, zobacz przestrzeń nazw XAML (x:) Funkcje językowe.For more information, see XAML Namespace (x:) Language Features.

Klasa bazowa MarkupExtensionThe MarkupExtension Base Class

Aby zdefiniować niestandardowe rozszerzenie znaczników, które może współtworzyć z domyślnymi implementacjami czytników XAML i autorów XAML w pliku System. XAML, należy utworzyć klasę z klasy abstrakcyjnej MarkupExtension .To define a custom markup extension that can interact with the default implementations of XAML readers and XAML writers in System.Xaml, you derive a class from the abstract MarkupExtension class. Ta klasa ma jedną metodę do przesłonięcia, czyli ProvideValue .That class has one method to override, which is ProvideValue. Może być również konieczne zdefiniowanie dodatkowych konstruktorów do obsługi argumentów do użycia rozszerzenia znaczników i dopasowanie właściwości settable.You might also need to define additional constructors to support arguments to the markup extension usage, and matching settable properties.

W ProvideValue programie niestandardowe rozszerzenie znaczników ma dostęp do kontekstu usługi, który zgłasza środowisko, w którym rozszerzenie znacznika jest wywoływane przez procesor XAML.Through ProvideValue, a custom markup extension has access to a service context that reports the environment where the markup extension is invoked by a XAML processor. W ścieżce ładowania zwykle jest to XamlObjectWriter .In the load path, this is typically a XamlObjectWriter. W ścieżce zapisu zwykle jest to XamlXmlWriter .In the save path this is typically a XamlXmlWriter. Każdy raport kontekstu usługi jako wewnętrznej klasy kontekstu dostawcy usług XAML implementującej wzorzec dostawcy usług.Each report the service context as an internal XAML service provider context class that implements a service provider pattern. Aby uzyskać więcej informacji na temat dostępnych usług i ich reprezentowania, zobacz Typy konwerterów i rozszerzenia znaczników dla języka XAML.For more information about the available services and what they represent, see Type Converters and Markup Extensions for XAML.

Klasa rozszerzenia znaczników musi używać publicznego poziomu dostępu; Procesory XAML muszą zawsze być w stanie utworzyć wystąpienie klasy obsługi rozszerzenia znaczników, aby można było korzystać z jej usług.Your markup extension class must use a public access level; XAML processors must always be able to instantiate the markup extension's support class in order to use its services.

Definiowanie typu pomocy technicznej dla niestandardowego rozszerzenia znacznikówDefining the Support Type for a Custom Markup Extension

W przypadku korzystania z usług lub platform programu .NET XAML, które kompilują się w usługach .NET XAML, dostępne są dwie opcje określające nazwę typu obsługi rozszerzenia znaczników.When you use .NET XAML Services or frameworks that build on .NET XAML Services, you have two choices for how to name the markup extension support type. Nazwa typu jest istotna dla sposobu, w jaki autorzy obiektów XAML próbują uzyskać dostęp i wywoływać typ obsługi rozszerzenia znaczników, gdy napotykają użycie rozszerzenia znacznika w języku XAML.The type name is relevant to how XAML object writers attempt to access and invoke a markup extension support type when they encounter a markup extension usage in XAML. Użyj jednej z następujących strategii nazewnictwa:Use one of the following naming strategies:

  • Wpisz nazwę typu, aby być dokładnym dopasowaniem do tokenu użycia znaczników języka XAML.Name the type name to be an exact match to the XAML markup usage token. Na przykład aby obsłużyć {Collate ...} użycie rozszerzenia, nazwij typ pomocy technicznej Collate .For example, to support a {Collate ...} extension usage, name the support type Collate.
  • Nazwij nazwę typu jako token ciągu użycia i sufiks Extension .Name the type name to be the usage string token plus the suffix Extension. Na przykład aby obsłużyć {Collate ...} użycie rozszerzenia, nazwij typ pomocy technicznej CollateExtension .For example, to support a {Collate ...} extension usage, name the support type CollateExtension.

Kolejność wyszukiwania ma najpierw wyszukać Extension nazwę klasy z sufiksem, a następnie poszukać nazwy klasy bez Extension sufiksu.The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.

W perspektywie użycia znaczników, w tym Extension sufiks w ramach użycia, jest prawidłowy.From the markup usage perspective, including the Extension suffix as part of the usage is valid. Jednakże zachowuje się tak, jakby Extension jest rzeczywiście częścią nazwy klasy, a autorzy obiektów XAML nie rozpoznają klasy obsługi rozszerzenia znaczników dla tego użycia, jeśli Klasa pomocy nie ma Extension sufiksu.However, this behaves as if Extension is truly part of the class name, and XAML object writers would fail to resolve a markup extension support class for that usage if the support class did not have the Extension suffix.

Konstruktor bez parametrówThe parameterless constructor

Dla wszystkich typów obsługi rozszerzeń znaczników należy uwidocznić publiczny Konstruktor bez parametrów.For all markup extension support types, you should expose a public parameterless constructor. Konstruktor bez parametrów jest wymagany w każdym przypadku, gdy moduł zapisujący obiektów XAML tworzy wystąpienie rozszerzenia znaczników z użycia elementu obiektu.A parameterless constructor is required for any case where a XAML object writer instantiates the markup extension from an object element usage. Użycie elementu pomocniczego obiektu jest uczciwym oczekiwaniem dla rozszerzenia znacznika, szczególnie w przypadku serializacji.Supporting object element usage is a fair expectation for a markup extension, particularly for serialization. Można jednak zaimplementować rozszerzenie znacznika bez konstruktora publicznego, jeśli zamierzasz obsługiwać użycie atrybutów rozszerzenia znaczników.However, you can implement a markup extension without a public constructor if you only intend to support attribute usages of the markup extension.

Jeśli użycie rozszerzenia znaczników nie ma argumentów, Konstruktor bez parametrów jest wymagany do obsługi użycia.If your markup extension usage has no arguments, the parameterless constructor is required to support usage.

Wzorce konstruktora i argumenty pozycyjne dla niestandardowego rozszerzenia znacznikówConstructor Patterns and Positional Arguments for a Custom Markup Extension

W przypadku rozszerzenia znacznika z zamierzonym użyciem argumentów konstruktory publiczne muszą odpowiadać trybów zamierzonego użycia.For a markup extension with intended argument usage, the public constructors must correspond to the modes of the intended usage. Innymi słowy, jeśli rozszerzenie znacznika zaprojektowano tak, aby wymagało jednego argumentu pozycyjnego jako prawidłowego użycia, należy obsługiwać Konstruktor publiczny z jednym parametrem wejściowym, który przyjmuje argument pozycyjny.In other words, if your markup extension is designed to require one positional argument as a valid usage, you should support a public constructor with one input parameter that takes the positional argument.

Załóżmy na przykład, że Collate rozszerzenie znaczników jest przeznaczone do obsługi tylko trybu, w którym istnieje jeden argument pozycyjny reprezentujący tryb, określony jako CollationMode stała wyliczenia.For example, suppose the Collate markup extension is intended to support only a mode where there is one positional argument that represents its mode, specified as a CollationMode enumeration constant. W takim przypadku powinien być Konstruktor o następującej postaci:In this case, there should be a constructor with the following form:

public Collate(CollationMode collationMode) {...}

Na poziomie podstawowym argumenty przekazane do rozszerzenia znacznika są ciągiem, ponieważ są przekazywane z wartości atrybutów znacznika.At a basic level, the arguments passed to a markup extension are a string because they are being forwarded from the markup's attribute values. Można utworzyć wszystkie ciągi argumentów i pracy z danymi wejściowymi na tym poziomie.You can make all of your arguments strings and work with input at that level. Jednak masz dostęp do pewnego przetwarzania, które występuje przed przekazaniem argumentów rozszerzenia znacznika do klasy obsługi.However, you do have access to certain processing that occurs before the markup extension arguments are passed to the support class.

Przetwarzanie działa koncepcyjnie tak, jakby rozszerzenie znaczników jest obiektem, który ma zostać utworzony, a następnie jego wartości elementów członkowskich są ustawione.The processing works conceptually as if the markup extension is an object to be created, and then its member values are set. Każda określona właściwość, która ma zostać ustawiona, jest szacowana podobnie jak określony element członkowski może być ustawiony dla utworzonego obiektu, gdy kod XAML jest analizowany.Each specified property to set is evaluated similar to how a specified member can be set on a created object when XAML is parsed. Istnieją dwie istotne różnice:There are two important differences:

  • Jak wspomniano wcześniej, typ obsługi rozszerzenia znaczników nie musi mieć konstruktora bez parametrów, aby można było utworzyć wystąpienie w języku XAML.As noted previously, a markup extension support type does not need to have a parameterless constructor in order to be instantiated in XAML. Konstruowanie obiektu jest odroczone do momentu, gdy jego możliwe argumenty w składni tekstu są określane jako argumenty pozycyjne lub nazwane, a odpowiedni Konstruktor jest wywoływany w tym czasie.Its object construction is deferred until its possible arguments in the text syntax are tokenized and evaluated as either positional or named arguments, and the appropriate constructor is called at that time.
  • Użycie rozszerzeń znaczników może być zagnieżdżone.Markup extensions usages can be nested. Najbardziej wewnętrzne rozszerzenie znacznika jest oceniane jako pierwsze.The innermost markup extension is evaluated first. W związku z tym można założyć takie użycie i zadeklarować jeden z parametrów konstrukcyjnych jako typ, który wymaga konwertera wartości (takiego jak rozszerzenie znacznika) do utworzenia.Therefore, you can assume such a usage and declare one of the construction parameters to be a type that requires a value converter (such as a markup extension) to produce.

W poprzednim przykładzie pokazano zależność tego przetwarzania.A reliance on such processing was shown in the previous example. Moduł zapisywania obiektów XAML usług programu .NET XAML przetwarza stałe nazwy wyliczenia na wartości wyliczane na poziomie natywnym..NET XAML Services XAML object writer processes enumeration constant names into enumerated values at a native level.

Przetwarzanie składni tekstu dla parametru pozycyjnego rozszerzenia znaczników może również polegać na konwerterze typów, który jest skojarzony z typem, który znajduje się w argumencie konstrukcji.Processing text syntax of a markup extension positional parameter can also rely on a type converter that is associated with the type that is in the construction argument.

Argumenty są nazywane argumentami pozycyjnymi, ponieważ kolejność, w której wykryto tokeny w wykorzystaniu, odpowiada kolejności pozycyjnyej parametru konstruktora, do którego są przypisane.The arguments are called positional arguments because the order in which the tokens in the usage is encountered corresponds to the positional order of the constructor parameter to which they are assigned. Rozważmy na przykład następujący podpis konstruktora:For example, consider the following constructor signature:

public Collate(CollationMode collationMode, object collateThis) {...}

Procesor XAML oczekuje dwóch argumentów pozycyjnych dla tego rozszerzenia znacznika.A XAML processor expects two positional arguments for this markup extension. Jeśli wystąpiło użycie {Collate AlphaUp,{x:Reference circularFile}} , AlphaUp token jest wysyłany do pierwszego parametru i oceniany jako CollationMode Wyliczenie o nazwie stała.If there was a usage {Collate AlphaUp,{x:Reference circularFile}}, the AlphaUp token is sent to the first parameter and evaluated as a CollationMode enumeration named constant. Wynik wewnętrzny x:Reference jest wysyłany do drugiego parametru i oceniany jako obiekt.The result of the inner x:Reference is sent to the second parameter and evaluated as an object.

W języku XAML określone reguły składni i przetwarzania rozszerzenia znaczników przecinek jest ogranicznikiem między argumentami, niezależnie od tego, czy te argumenty są argumentami pozycyjnymi, czy nazwanymi argumentami.In the XAML specified rules for markup extension syntax and processing, the comma is the delimiter between arguments, whether those arguments are positional arguments or named arguments.

Zduplikowane argumenty argumentów pozycyjnychDuplicate arity of positional arguments

Jeśli moduł zapisujący obiektów XAML napotyka użycie rozszerzenia znacznika z argumentami pozycyjnymi, a istnieje wiele argumentów konstruktora, które pobierają liczbę argumentów (zduplikowane liczby argumentów), które nie muszą być błędem.If a XAML object writer encounters a markup extension usage with positional arguments, and there are multiple constructor arguments that take that number of arguments (a duplicate arity), that is not necessarily an error. Zachowanie jest zależne od dostosowywalnego ustawienia kontekstu schematu XAML SupportMarkupExtensionsWithDuplicateArity .The behavior depends on a customizable XAML schema context setting, SupportMarkupExtensionsWithDuplicateArity. Jeśli SupportMarkupExtensionsWithDuplicateArity tak true , moduł zapisujący obiektów XAML nie powinien zgłaszać wyjątku tylko z powodu zduplikowanych argumentów.If SupportMarkupExtensionsWithDuplicateArity is true, a XAML object writer should not throw an exception only for reasons of duplicate arity. Zachowanie wykraczające poza ten punkt nie jest ściśle zdefiniowane.Behavior beyond that point is not strictly defined. Podstawowa założenie projektu polega na tym, że kontekst schematu ma informacje o typie dostępne dla określonych parametrów i może próbować jawnie rzutowania, które pasują do zduplikowanych kandydatów, aby zobaczyć, który podpis może być najlepszym dopasowaniem.The basic design assumption is that the schema context has type information available for the specific parameters and can attempt explicit casts that match the duplicate candidates to see which signature might be the best match. Wyjątek może być nadal zgłaszany, jeśli żadna sygnatura nie może przekazać testów, które są nakładane przez określony kontekst schematu, który jest uruchomiony w składniku zapisywania obiektów XAML.An exception might still be thrown if no signatures can pass the tests that are imposed by that particular schema context that is running on a XAML object writer.

Domyślnie program SupportMarkupExtensionsWithDuplicateArity jest false w środowisku CLR opartym XamlSchemaContext na platformie .NET XAML.By default, SupportMarkupExtensionsWithDuplicateArity is false in the CLR-based XamlSchemaContext for .NET XAML Services. W ten sposób domyślnie XamlObjectWriter zgłasza wyjątki, jeśli napotka użycie rozszerzenia znacznika, w którym występują zduplikowane liczby argumentów w konstruktorach typu kopii zapasowej.Thus, the default XamlObjectWriter throws exceptions if it encounters a markup extension usage where there is duplicate arity in the backing type's constructors.

Nazwane argumenty dla niestandardowego rozszerzenia znacznikówNamed arguments for a custom markup extension

Rozszerzenia znaczników określone przez język XAML mogą również użyć formularza nazwanych argumentów do użycia.Markup extensions as specified by XAML can also use a named arguments form for usage. Na pierwszym poziomie tokenizacji składnia tekstu jest podzielona na argumenty.At the first level of tokenization, the text syntax is divided into arguments. Obecność znaku równości (=) w dowolnym argumencie identyfikuje argument jako argument nazwany.The presence of an equals sign (=) within any argument identifies an argument as a named argument. Taki argument jest również tokenem w parze nazwa/wartość.Such an argument is also tokenized into a name/value pair. Nazwa w tym przypadku nazywa publiczną właściwość settable typu obsługi rozszerzenia znaczników.The name in this case names a public settable property of the markup extension's support type. Jeśli zamierzasz obsługiwać użycie argumentów nazwanych, należy podać te właściwości.If you intend to support named argument usage, you should provide these public settable properties. Właściwości mogą być dziedziczonymi właściwościami, o ile pozostaną one publiczne.The properties can be inherited properties as long as they remain public.

Uzyskiwanie dostępu do kontekstu dostawcy usług z implementacji rozszerzenia znacznikówAccessing Service Provider Context from a Markup Extension Implementation

Dostępne usługi są takie same dla dowolnego konwertera wartości.The services available are the same for any value converter. Różnica polega na tym, jak każdy konwerter wartości otrzymuje kontekst usługi.The difference is in how each value converter receives the service context. Dostęp do usług i dostępnych usług są udokumentowane w sekcji konwertery typów i rozszerzenia znaczników dla języka XAML.Accessing services and the services available are documented in the topic Type Converters and Markup Extensions for XAML.

Użycie elementu właściwości w rozszerzeniu znacznikówProperty element usage of a markup extension

Scenariusze użycia rozszerzenia znaczników są często zaprojektowane przy użyciu rozszerzenia znaczników w użyciu atrybutu.The scenarios for markup extension usages are often designed around using the markup extension in attribute usage. Jest jednak możliwe również zdefiniowanie klasy zapasowej do obsługi użycia elementów właściwości.However, it is also potentially possible to define the backing class to support property element usage.

Aby obsługiwać użycie elementu właściwości w rozszerzeniu znacznika, zdefiniuj publiczny Konstruktor bez parametrów.To support property element usage of your markup extension, define a public parameterless constructor. Powinien to być Konstruktor wystąpienia nie jest konstruktorem statycznym.This should be an instance constructor not a static constructor. Jest to wymagane, ponieważ procesor XAML musi ogólnie wywołać Konstruktor bez parametrów dla dowolnego elementu obiektu, który przetwarza z znaczników, i obejmuje klasy rozszerzeń znaczników jako elementy obiektu.This is required because a XAML processor must generally invoke the parameterless constructor on any object element it processes from markup, and this includes markup extension classes as object elements. W przypadku zaawansowanych scenariuszy można definiować inne niż domyślne ścieżki konstrukcyjne dla klas.For advanced scenarios, you can define non-default construction paths for classes. (Aby uzyskać więcej informacji, zobacz dyrektywa x:FactoryMethod). Nie należy jednak używać tych wzorców do celów rozszerzeń znaczników, ponieważ sprawia to, że odnajdywanie wzorca użycia znacznie trudniejsze, zarówno dla projektantów, jak i dla użytkowników nieprzetworzonych znaczników.(For more information, see x:FactoryMethod Directive.) However, you should not use these patterns for markup extension purposes because this makes discovery of the usage pattern much more difficult, both for designers and for users of raw markup.

Przypisywanie do niestandardowego rozszerzenia znacznikówAttributing for a custom markup extension

Aby obsługiwać zarówno środowiska projektowe, jak i niektóre scenariusze modułu zapisywania obiektów XAML, należy atrybutować typ obsługi rozszerzenia znaczników z kilkoma atrybutami CLR.To support both design environments and certain XAML object writer scenarios, you should attribute a markup extension support type with several CLR attributes. Te atrybuty raportują zamierzone użycie rozszerzenia znaczników.These attributes report the intended markup extension usage.

MarkupExtensionReturnTypeAttribute raportuje Type Informacje dla zwracanego typu obiektu ProvideValue .MarkupExtensionReturnTypeAttribute reports the Type information for the object type that ProvideValue returns. Za pomocą czystego podpisu, ProvideValue zwraca Object .By its pure signature, ProvideValue returns Object. Jednak różni klienci mogą chcieć dokładniej zwracać informacje o typie.But various consumers might want more precise return type information. Obejmuje to następujące działania:This includes:

  • Projektanci i środowisk IDE, którzy mogą mieć możliwość zapewnienia pomocy technicznej opartej na typie dla użycia rozszerzenia znaczników.Designers and IDEs, who might be able to provide type-aware support for markup extension usages.
  • Zaawansowane implementacje SetMarkupExtension programów obsługi w klasach docelowych, które mogą polegać na odbiciu w celu określenia typu zwracanego rozszerzenia znacznika zamiast rozgałęziania określonych znanych MarkupExtension implementacji według nazwy.Advanced implementations of SetMarkupExtension handlers on target classes, which might rely on reflection to determine a markup extension's return type instead of branching on specific known MarkupExtension implementations by name.

Serializacja użycia rozszerzenia znacznikówSerialization of markup extension usages

Gdy moduł zapisujący obiektów XAML przetwarza użycie i wywołania rozszerzenia znaczników ProvideValue , kontekst dla niego poprzednio jest używany do rozszerzenia znaczników w strumieniu węzła XAML, ale nie na grafie obiektów.When a XAML object writer processes a markup extension usage and calls ProvideValue, the context for it previously being a markup extension usage persists in the XAML node stream but not in the object graph. Na grafie obiektów zachowywana jest tylko wartość.In the object graph, only the value is preserved. Jeśli masz scenariusze projektowania lub inne powody, aby zachować oryginalne użycie rozszerzenia znacznika w serializowanych danych wyjściowych, musisz zaprojektować własną infrastrukturę do śledzenia użycia rozszerzenia znaczników ze strumienia węzłów XAML ścieżki ładowania.If you have design scenarios or other reasons for persisting the original markup extension usage into the serialized output, you must design your own infrastructure for tracking the markup extension usages from the load path XAML node stream. Możesz zaimplementować zachowanie, aby ponownie utworzyć elementy strumienia węzła ze ścieżki ładowania i odtworzyć je z powrotem do modułów zapisujących XAML w celu serializacji w ścieżce zapisu, zastępując wartość w odpowiedniej pozycji strumienia węzła.You can implement behavior to recreate the elements of the node stream from the load path and play them back to XAML writers for serialization in the save path, substituting for the value in the appropriate position of the node stream.

Rozszerzenia znaczników w strumieniu węzła XAMLMarkup extensions in the XAML node stream

Jeśli pracujesz ze strumieniem węzła XAML na ścieżce ładowania, użycie rozszerzenia znacznika jest wyświetlane w strumieniu węzła jako obiekt.If you are working with a XAML node stream on the load path, a markup extension usage appears in the node stream as an object.

Jeśli użycie rozszerzenia znacznika używa argumentów pozycyjnych, jest reprezentowane jako obiekt początkowy z wartością inicjalizacji.If the markup extension usage uses positional arguments, it is represented as a start object with an initialization value. Jako tekstowa reprezentacja, strumień węzłów jest podobny do następującego:As a rough text representation, the node stream resembles the following:

StartObject ( XamlType jest typem definicji rozszerzenia znacznika, a nie jego typem zwracanym)StartObject (XamlType is the markup extension's definition type, not its return type)

StartMember (nazwa elementu XamlMember is _InitializationText )StartMember (name of the XamlMember is _InitializationText)

Value (wartość to argumenty pozycyjne jako ciąg obejmujący ograniczników)Value (value is the positional arguments as a string including the intervening delimiters)

EndMember

EndObject

Użycie rozszerzenia znacznika z nazwanymi argumentami jest reprezentowane jako obiekt z elementami członkowskimi odpowiednich nazw, z których każdy ma ustawioną wartość ciągu tekstowego.A markup extension usage with named arguments is represented as an object with members of the relevant names, each set with text string values.

Faktyczne wywoływanie ProvideValue implementacji rozszerzenia znacznika wymaga kontekstu schematu XAML, ponieważ wymaga mapowania typu i tworzenia wystąpienia typu rozszerzenia znaczników.Actually invoking the ProvideValue implementation of a markup extension requires the XAML schema context because that requires type-mapping and creating a markup extension support type instance. Jest to jedną z przyczyn, dlaczego użycie rozszerzeń znaczników jest zachowywane w ten sposób w domyślnych strumieniach węzłów usług XAML platformy .NET — część czytnika ścieżki ładowania często nie ma dostępnego kontekstu schematu XAML.This is one reason why markup extension usages are preserved this way in the default .NET XAML Services node streams - the reader part of a load path often does not have the necessary XAML schema context available.

Jeśli pracujesz ze strumieniem węzła XAML na ścieżce zapisu, ogólnie nie ma nic obecne w reprezentacji grafu obiektów, która może informować o tym, że obiekt do serializacji został pierwotnie dostarczony przez użycie rozszerzenia znacznika i ProvideValue wynik.If you are working with a XAML node stream on the save path, there generally is nothing present in an object graph representation that can inform you that the object to serialize was originally provided by a markup extension usage and a ProvideValue result. Scenariusze, które muszą utrwalać użycie rozszerzeń znaczników dla operacji przerywania, a także przechwytywania innych zmian na grafie obiektów muszą opracować własne techniki, aby zachować wiedzę na temat użycia rozszerzenia znaczników z oryginalnego danych wejściowych XAML.Scenarios that need to persist markup extension usages for round-tripping while also capturing other changes in the object graph must devise their own techniques for preserving the knowledge of a markup extension usage from the original XAML input. Na przykład, aby przywrócić użycie rozszerzenia znaczników, może być konieczne współdziałanie ze strumieniem węzła na ścieżce zapisu w celu przywrócenia użycia rozszerzenia znaczników lub wykonania pewnego typu scalania między oryginalnym XAML i okrągłym wyłącznikiem XAML.For example, to restore the markup extension usages, you may need to work with the node stream on the save path in order to restore markup extension usages, or perform some type of merge between the original XAML and the round-tripped XAML. Niektóre struktury implementujące kod XAML, takie jak WPF, używają typów pośrednich (Expressions) do reprezentowania przypadków, w których użycie rozszerzenia znaczników dostarczyło wartości.Some XAML-implementing frameworks such as WPF use intermediate types (expressions) to help represent cases where markup extension usages provided the values.

Zobacz takżeSee also