Definování vlastních typů pro použití se službami .NET XAML Services
Při definování vlastních typů, které jsou obchodní objekty nebo typy, které nemají závislost na konkrétních architekturách, existují určité osvědčené postupy pro XAML, které můžete postupovat. Pokud budete postupovat podle těchto postupů, můžou služby .NET XAML a její čtenáře XAML a zapisovače XAML zjistit vlastnosti XAML vašeho typu a poskytnout mu odpovídající reprezentaci ve streamu uzlu XAML pomocí systému typů XAML. Toto téma popisuje osvědčené postupy pro definice typů, definice členů a přiřazení typů nebo členů clR.
Vzory konstruktoru a definice typů pro XAML
Aby bylo možné vytvořit instanci objektu v XAML, musí vlastní třída splňovat následující požadavky:
Vlastní třída musí být veřejná a musí zveřejnit veřejný konstruktor bez parametrů. (Poznámky týkající se struktur najdete v následující části.)
Vlastní třída nesmí být vnořenou třídou. Nadbytečná tečka v cestě s úplným názvem způsobí, že dělení oboru názvů třídy je nejednoznačné a koliduje s dalšími funkcemi XAML, jako jsou připojené vlastnosti. Pokud lze vytvořit instanci objektu jako prvek objektu, vytvořený objekt může vyplnit formulář prvku vlastnosti všech vlastností, které přebírají objekt jako jejich základní typ.
Pokud povolíte převaděč hodnot hodnot, můžete stále zadat hodnoty objektů pro typy, které nesplňují tato kritéria. Další informace naleznete v tématu Převaděče typů a rozšíření značek pro XAML.
Struktury
Struktury se vždy dají vytvořit v XAML pomocí definice CLR. Důvodem je to, že kompilátor CLR implicitně vytvoří konstruktor bez parametrů pro strukturu. Tento konstruktor inicializuje všechny hodnoty vlastností na výchozí hodnoty.
V některýchpřípadechch Důvodem může být to, že struktura je určená k vyplnění hodnot a funkce koncepčně jako sjednocení. Jako sjednocení mohou obsažené hodnoty mít vzájemně vylučující interpretace, a proto žádná z jejích vlastností není nastavena. Příkladem takové struktury ve slovníku WPF je GridLength. Tyto struktury by měly implementovat převaděč typů tak, aby hodnoty lze vyjádřit ve formě atributu pomocí řetězcových konvencí, které vytvářejí různé interpretace nebo režimy hodnot struktury. Struktura by také měla vystavit podobné chování pro vytváření kódu prostřednictvím konstruktoru bez parametrů.
Rozhraní
Rozhraní lze použít jako základní typy členů. Systém typů XAML zkontroluje přiřaditelný seznam a očekává, že objekt, který je zadaný jako hodnota, lze přiřadit rozhraní. Neexistuje žádný koncept toho, jak musí být rozhraní prezentováno jako typ XAML, pokud relevantní přiřaditelný typ podporuje požadavky na výstavbu XAML.
Metody továrny
Metody továrny jsou funkce XAML 2009. Upravují princip XAML, který objekty musí mít konstruktory bez parametrů. Metody továrny nejsou zdokumentované v tomto článku. Viz x:FactoryMethod – direktiva.
Vyčíslení
Výčty mají chování převodu nativního typu XAML. Názvy konstant výčtu zadané v jazyce XAML se přeloží na základní typ výčtu a vrátí hodnotu výčtu do zapisovače objektu XAML.
XAML podporuje použití příznaků ve stylu výčtů s FlagsAttribute použitými. Další informace naleznete v tématu syntaxe XAML podrobně. (syntaxe XAML podrobně je napsána pro cílovou skupinu WPF, ale většina informací v tomto tématu je relevantní pro XAML, která není specifická pro konkrétní prováděcí architekturu.)
Definice členů
Typy mohou definovat členy pro použití XAML. Typy můžou definovat členy, které jsou použitelné XAML, i když daný typ není použitelný pro XAML. To je možné kvůli dědičnosti CLR. Pokud některý typ, který dědí člena, podporuje použití XAML jako typ a člen podporuje použití XAML pro jeho základní typ nebo má k dispozici nativní syntaxi XAML, je tento člen použitelný XAML.
Vlastnosti
Pokud definujete vlastnosti jako veřejnou vlastnost CLR pomocí typických vzorů get
CLR a set
přístupových vzorů a klíčových slov vhodných pro jazyk, může systém typů XAML ohlásit vlastnost jako člen s odpovídajícími informacemi zadanými pro XamlMember vlastnosti, jako jsou IsReadPublic a IsWritePublic.
Konkrétní vlastnosti mohou povolit syntaxi textu použitím TypeConverterAttribute. Další informace naleznete v tématu Převaděče typů a rozšíření značek pro XAML.
Pokud neexistuje syntaxe textu nebo nativní převod XAML a bez dalšího nepřímého použití, jako je použití rozšíření značek, musí být typ vlastnosti (TargetType v systému typů XAML) schopný vrátit instanci objektu XAML zapisovačem objektu XAML tím, že s cílovým typem zachází jako s typem CLR.
Pokud používáte XAML 2009, x:Reference Rozšíření značek lze použít k zadání hodnot, pokud předchozí aspekty nejsou splněny; To je ale spíše problém s používáním než problém s definicí typu.
Dění
Pokud definujete události jako veřejnou událost CLR, systém typů XAML může událost hlásit jako člena s IsEvent jako true
. Zapojení obslužných rutin událostí není v rámci možností .NET XAML Services; zapojení je ponecháno na konkrétních architekturách a implementacích.
Metody
Vložený kód pro metody není výchozí funkcí XAML. Ve většině případů neodkazujete přímo na členy metody z XAML a role metod v XAML je pouze poskytovat podporu pro konkrétní vzory XAML. x:FactoryMethod – direktiva je výjimkou.
Pole
Pokyny pro návrh CLR neodporují nestatickým polím. Pro statická pole můžete přistupovat k hodnotám statických polí pouze prostřednictvím x:Static Markup Extension; v tomto případě neprovádíte nic zvláštního v definici CLR, abyste zpřístupnili pole pro x:Static použití.
Připojitelné členy
Připojitelné členy jsou vystaveny XAML prostřednictvím vzoru metody přistupujícího objektu pro definování typu. Samotný definující typ nemusí být použitelný jako objekt XAML. Ve skutečnosti je běžným vzorem deklarovat třídu služby, jejíž role je vlastníkem připojitelného člena a implementovat související chování, ale obsluhovat žádnou jinou funkci, jako je reprezentace uživatelského rozhraní. V následujících částech představuje zástupný symbol PropertyName název vašeho připojitelného člena. Tento název musí být platný v XamlName Grammar.
Buďte opatrní při kolizi názvů mezi těmito vzory a jinými metodami typu. Pokud člen existuje, který odpovídá jednomu ze vzorů, lze jej interpretovat jako cestu použití připojitelného člena procesorem XAML, i když to nebylo vaším záměrem.
The GetPropertyName Accessor
Podpis přístupového objektu GetPropertyName
musí být následující:
public static object GetPropertyName(object target)
Objekt
target
lze v implementaci zadat jako konkrétnější typ. Můžete ho použít k určení rozsahu využití připojitelného člena; použití mimo zamýšlený obor vyvolá neplatné výjimky přetypování, které se pak zobrazí chybou analýzy XAML. Název parametrutarget
není požadavek, ale má názevtarget
konvencí ve většině implementací.Návratovou hodnotu je možné zadat jako konkrétnější typ v implementaci.
Pokud chcete podporovat TypeConverter povolenou syntaxi textu pro použití atributu připojitelného členu, použijte TypeConverterAttribute u přístupového objektu GetPropertyName
. Použití na get
místo set
se může zdát neintuitivní; Tato konvence však může podporovat koncept připojitelných členů jen pro čtení, které jsou serializovatelné, což je užitečné ve scénářích návrháře.
Objekt SetPropertyName
Podpis přístupového objektu SetPropertyName
musí být následující:
public static void SetPropertyName(object target, object value)
Objekt
target
lze zadat jako konkrétnější typ vaší implementace se stejnou logikou a důsledky, jak je popsáno v předchozí části.Objekt
value
lze v implementaci zadat jako konkrétnější typ.
Mějte na paměti, že hodnota pro tuto metodu je vstup pocházející z použití XAML, obvykle ve formě atributu. Ve formuláři atributu musí být podpora převaděče hodnot pro textovou syntaxi a vy atributu na GetPropertyName
příslušenství.
Připojitelné úložiště členů
Metody přistupování obvykle nestačí k tomu, aby poskytovaly prostředky k umístění připojitelných hodnot členů do objektového grafu nebo k načtení hodnot z objektového grafu a jejich správné serializaci. Aby bylo možné tuto funkci poskytnout, musí být objekty target
v předchozích podpisech přístupových objektů schopné ukládat hodnoty. Mechanismus úložiště by měl být konzistentní s principem připojitelného člena, který je možné připojit k cílům, kde připojitelný člen není v seznamu členů. Služby .NET XAML services poskytují metodu implementace pro připojitelné členské úložiště prostřednictvím rozhraní API IAttachedPropertyStore a AttachablePropertyServices.
IAttachedPropertyStore používají zapisovače XAML ke zjišťování implementace úložiště a měly by být implementovány u typu, který je target
přístupových objektů. Statická rozhraní API AttachablePropertyServices se používají v těle přístupových objektů a odkazují na připojitelný člen jeho AttachableMemberIdentifier.
XAML-Related atributy CLR
Správné přiřazení typů, členů a sestavení je důležité, aby bylo možné hlásit systémové informace o typu XAML službě .NET XAML Services. Pokud platí některý z následujících situací, jsou informace o systému typů XAML pro generování sestav relevantní:
- Máte v úmyslu používat typy s systémy XAML, které jsou přímo založené na čtečkách XAML služeb .NET XAML a zapisovačích XAML.
- Definujete nebo používáte architekturu využívající XAML, která je založená na těchto čtenářích XAML a zapisovačích XAML.
Seznam jednotlivých atributů souvisejících s XAML, které jsou relevantní pro podporu XAML vašich vlastních typů, najdete v tématu XAML-Related atributy CLR pro vlastní typy a knihovny.
Zvyk
Použití vlastních typů vyžaduje, aby autor revizí namapovat předponu pro sestavení a obor názvů CLR, který obsahuje vlastní typ. Tento postup není v tomto tématu zdokumentovaný.
Úroveň přístupu
XAML poskytuje prostředky pro načtení a vytvoření instance typů, které mají internal
úroveň přístupu. Tato funkce je poskytována tak, aby uživatelský kód mohl definovat vlastní typy a pak vytvořit instanci těchto tříd z revizí, které jsou také součástí stejného oboru uživatelského kódu.
Příkladem z WPF je vždy, když uživatelský kód definuje UserControl, který je určený jako způsob refaktorování chování uživatelského rozhraní, ale ne jako součást jakéhokoli možného mechanismu rozšíření, který by mohl být odvozen deklarací podpůrné třídy s public
úrovní přístupu. Takový UserControl lze deklarovat pomocí internal
přístupu, pokud je backingový kód zkompilován do stejného sestavení, ze kterého se odkazuje jako typ XAML.
Pro aplikaci, která načte XAML pod úplným vztahem důvěryhodnosti a používá XamlObjectWriter, načítání tříd s internal
úroveň přístupu je vždy povoleno.
U aplikace, která načítá XAML v částečném vztahu důvěryhodnosti, můžete řídit charakteristiky úrovně přístupu pomocí rozhraní API XamlAccessLevel. Také odložené mechanismy (například systém šablon WPF) musí být schopné rozšířit všechna oprávnění na úrovni přístupu a zachovat je pro případná vyhodnocení doby běhu; zpracovává se interně předáním XamlAccessLevel informací.
Implementace WPF
WPF XAML používá model přístupu s částečným vztahem důvěryhodnosti, kde pokud je BAML načten pod částečným vztahem důvěryhodnosti, je přístup omezen na AssemblyAccessTo pro sestavení, které je zdrojem BAML. Pro odložení používá WPF IXamlObjectWriterFactory.GetParentSettings jako mechanismus pro předávání informací na úrovni přístupu.
V terminologii WPF XAML je interní typ je typ definovaný stejným sestavením, které obsahuje také odkazování XAML. Takový typ lze mapovat prostřednictvím oboru názvů XAML, který záměrně vynechá sestavení = část mapování, například xmlns:local="clr-namespace:WPFApplication1"
. Pokud BAML odkazuje na interní typ a tento typ má internal
úroveň přístupu, vygeneruje GeneratedInternalTypeHelper
třídu sestavení. Chcete-li se vyhnout GeneratedInternalTypeHelper
, musíte buď použít public
úroveň přístupu, nebo musíte faktorovat příslušnou třídu do samostatného sestavení a učinit toto sestavení závislé.
Viz také
.NET Desktop feedback