TypeConverters a XAML

Toto téma představuje účel převodu typu z řetězce jako obecné funkce jazyka XAML. V rozhraní .NET Framework TypeConverter třída slouží jako součást implementace pro spravovanou vlastní třídu, kterou lze použít jako hodnotu vlastnosti v použití atributu XAML. Pokud napíšete vlastní třídu a chcete, aby instance vaší třídy byly použitelné jako hodnoty atributu XAML settable, budete možná muset použít třídu TypeConverterAttribute , napsat vlastní TypeConverter třídu nebo obojí.

Koncepty převodu typů

Hodnoty XAML a řetězce

Když nastavíte hodnotu atributu v souboru XAML, počáteční typ této hodnoty je řetězec v čistém textu. Dokonce i jiné primitivy, jako Double jsou počáteční textové řetězce procesoru XAML.

Procesor XAML potřebuje ke zpracování hodnoty atributu dva údaje. První informace je typ hodnoty vlastnosti, která je nastavena. Jakýkoli řetězec, který definuje hodnotu atributu a který je zpracován v XAML, musí být nakonec převeden nebo přeložen na hodnotu tohoto typu. Pokud je hodnota primitivním analyzátorem XAML (například číselnou hodnotou), pokusí se o přímý převod řetězce. Pokud je hodnota výčtu, řetězec se použije ke kontrole shody názvu s pojmenovanou konstantou v daném výčtu. Pokud hodnota není primitivní ani výčtem nepochopená analyzátorem, musí být daný typ schopen poskytnout instanci typu nebo hodnotu na základě převedeného řetězce. To se provádí indikováním třídy převaděče typů. Převaděč typů je účinně pomocná třída pro poskytování hodnot jiné třídy, a to jak pro scénář XAML, tak i pro volání kódu v kódu .NET.

Použití existujícího chování při převodu typů v XAML

V závislosti na znalostech základních konceptů XAML už možná používáte chování převodu typů v základní aplikaci XAML, aniž byste si ji uvědomili. WpF například definuje doslova stovky vlastností, které berou hodnotu typu Point. A Point je hodnota, která popisuje souřadnici v dvojrozměrném souřadnicovém prostoru a má opravdu jen dvě důležité vlastnosti: X a Y. Když v XAML zadáte bod, zadáte ho jako řetězec s oddělovačem (obvykle čárkou) mezi zadanými X hodnotami a Y hodnotami. Příklad: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>.

I tento jednoduchý typ Point a jeho jednoduché použití v XAML zahrnuje převaděč typů. V tomto případě to je třída PointConverter.

Převaděč typů definovaný Point na úrovni třídy zjednodušuje použití značek všech vlastností, které berou Point. Bez převaděče typů byste potřebovali následující mnohem podrobnější kód pro stejný příklad, jak je znázorněno dříve:

<LinearGradientBrush>
  <LinearGradientBrush.StartPoint>
    <Point X="0" Y="0"/>
  </LinearGradientBrush.StartPoint>
  <LinearGradientBrush.EndPoint>
    <Point X="1" Y="1"/>
  </LinearGradientBrush.EndPoint>
</LinearGradientBrush>

Zda použít řetězec převodu typu nebo více podrobné ekvivalentní syntaxe je obecně volba stylu kódování. Pracovní postup nástrojů XAML může také ovlivnit způsob nastavení hodnot. Některé nástroje XAML obvykle generují nejrozsáhlejší formu revizí, protože je jednodušší přepojit na zobrazení návrháře nebo vlastní mechanismus serializace.

Existující převaděče typů lze obecně zjistit u typů WPF a .NET Framework kontrolou třídy (nebo vlastnosti) přítomnosti použité TypeConverterAttribute. Tento atribut pojmenuje třídu, která je podpůrným převaděčem typů pro hodnoty tohoto typu, pro účely XAML a potenciálně i pro jiné účely.

Převaděče typů a rozšíření značek

Rozšíření značek a převaděče typů vyplňují orthogonální role z hlediska chování procesoru XAML a scénářů, na které se vztahují. Kontext je sice k dispozici pro použití rozšíření značek, ale chování převodu typů vlastností, ve kterých rozšíření značek poskytuje hodnotu, se obecně nekontroluje v implementacích rozšíření značek. Jinými slovy, i když rozšíření revizí vrátí textový řetězec jako výstup ProvideValue , chování převodu typu u tohoto řetězce použitého na konkrétní vlastnost nebo typ hodnoty vlastnosti není vyvoláno, obecně, účelem rozšíření značek je zpracovat řetězec a vrátit objekt bez zapojení převaděče typů.

Jednou z běžných situací, kdy je rozšíření značek nezbytné místo převaděče typů, je vytvořit odkaz na objekt, který již existuje. V nejlepším případě může převaděč bezstavového typu vygenerovat pouze novou instanci, která nemusí být žádoucí. Další informace o rozšířeních značek naleznete v tématu Rozšíření značek a WPF XAML.

Převaděče nativních typů

V implementaci analyzátoru XAML WPF a .NET Framework existují určité typy, které mají zpracování nativních převodů typů, ale nejsou typy, které by mohly být obvykle považovány za primitivy. Příkladem takového typu je DateTime. Důvodem je způsob fungování architektury rozhraní .NET Framework: typ DateTime je definován v knihovně mscorlib, což je nejzásadnější knihovna v .NET. DateTime není povoleno přiřazovat atributem, který pochází z jiného sestavení, které zavádí závislost (TypeConverterAttribute je ze systému), takže obvyklý mechanismus zjišťování převaděče typů pomocí přisuzování nelze podporovat. Analyzátor XAML má místo toho seznam typů, které potřebují takové nativní zpracování a procesy podobně jako skutečné primitivy jsou zpracovávány. (V případě DateTime toho se týká volání Parse.)

Implementace převaděče typů

TypeConverter

V předchozím příkladu Point byla zmíněna třída PointConverter . Pro implementace XAML .NET jsou všechny převaděče typů, které se používají pro účely XAML, třídy odvozené ze základní třídy TypeConverter. Třída TypeConverter existovala ve verzích rozhraní .NET Framework, které předchází existenci XAML. Jedním z původních použití bylo poskytnutí převodu řetězců pro dialogová okna vlastností ve vizuálních návrhářích. Pro XAML je role TypeConverter rozšířena tak, aby zahrnovala základní třídu pro převody na řetězec a z řetězce, které umožňují parsování hodnoty atributu řetězce a případně zpracování hodnoty runtime konkrétní vlastnosti objektu zpět do řetězce pro serializaci jako atribut.

TypeConverter definuje čtyři členy, které jsou relevantní pro převod na řetězce a z řetězců pro účely zpracování XAML:

Z těchto, nejdůležitější metodou je ConvertFrom. Tato metoda převede vstupní řetězec na požadovaný typ objektu. Přesněji řečeno, metoda by mohla být implementována ConvertFrom k převodu mnohem širšího rozsahu typů na zamýšlený cílový typ převaděče, a proto slouží k účelům, které překračují rámec XAML, jako je podpora převodů za běhu, ale pro účely XAML je to pouze cesta kódu, která může zpracovat String vstup, který je důležitý.

Další nejdůležitější metodou je ConvertTo. Pokud je aplikace převedena na reprezentaci značek (například pokud je uložena do XAML jako soubor), ConvertTo je zodpovědná za vytvoření reprezentace značek. V tomto případě je cesta kódu, která je důležitá pro XAML, je, když předáte destinationType znak String .

CanConvertTo a CanConvertFrom jsou metody podpory, které se používají, když služba dotazuje schopnosti TypeConverter implementace. Tyto metody je nutné implementovat, aby se vrátily true pro případy specifické pro typ, které ekvivalentní metody převodu vašeho převaděče podporují. Pro účely XAML to obecně znamená String typ.

Jazykové verze a převaděče typů pro XAML

Každá TypeConverter implementace může mít vlastní interpretaci toho, co představuje platný řetězec pro převod, a může také použít nebo ignorovat popis typu předaný jako parametry. Je potřeba vzít v úvahu důležité aspekty týkající se jazykové verze a převodu typů XAML. Xaml plně podporuje použití lokalizovatelných řetězců jako hodnot atributů. Použití tohoto lokalizovatelného řetězce jako vstupu převaděče typů s konkrétními požadavky jazykové verze není podporováno, protože převaděče typů pro hodnoty atributů XAML zahrnují nutně chování analýzy jazyka s pevnou jazykovou verzí.en-US Další informace o důvodech návrhu tohoto omezení najdete ve specifikaci jazyka XAML ([MS-XAML].

Jako příklad, kdy může být jazyková verze problémem, používají některé jazykové verze čárku jako oddělovač desetinných míst pro čísla. To bude kolidovat s chováním, které má mnoho převaděčů typů WPF XAML, což je použití čárky jako oddělovače (na základě historických předchůdců, jako je například společný formulář X,Y nebo seznamy oddělené čárkami). I předání jazykové verze v okolním jazyce XAML (nastavení Language nebo xml:langsl-SI jazykové verzi, příklad jazykové verze, která tímto způsobem používá čárku pro desítkové číslo), problém nevyřeší.

Implementace funkce ConvertFrom

Aby byla použitelná jako TypeConverter implementace podporující XAML, ConvertFrom musí metoda pro tento převaděč přijmout řetězec jako value parametr. Pokud byl řetězec v platném formátu a lze jej převést implementací TypeConverter , vrácený objekt musí podporovat přetypování na typ očekávaný vlastností. ConvertFrom V opačném případě musí implementace vrátit null.

Každá TypeConverter implementace může mít vlastní interpretaci toho, co představuje platný řetězec pro převod, a může také použít nebo ignorovat popis typu nebo kontexty jazykové verze předané jako parametry. Zpracování WPF XAML však nemusí předávat hodnoty kontextu popisu typu ve všech případech a také nemusí předávat jazykovou verzi na xml:langzákladě .

Poznámka:

Nepoužívejte složené závorky, zejména {, jako možný prvek formátu řetězce. Tyto znaky jsou vyhrazeny jako vstup a konec pro sekvenci rozšíření značek.

Implementace metody ConvertTo

ConvertTo je potenciálně používán pro podporu serializace. Podpora serializace pro ConvertTo váš vlastní typ a jeho typ převaděče není absolutní požadavek. Pokud však implementujete ovládací prvek nebo používáte serializaci jako součást funkcí nebo návrhu třídy, měli byste implementovat ConvertTo.

Aby byla použitelná jako TypeConverter implementace podporující XAML, ConvertTo musí metoda tohoto převaděče přijmout instanci typu (nebo hodnotu), která je podporována value jako parametr. destinationType Pokud je parametr typem String, musí být vrácený objekt schopen přetypovat jako String. Vrácený řetězec musí představovat serializovanou hodnotu value. V ideálním případě by formát serializace, který zvolíte, měl být schopen generovat stejnou hodnotu, pokud byl tento řetězec předán implementaci ConvertFrom stejného převaděče, bez významné ztráty informací.

Pokud hodnotu nelze serializovat nebo převaděč nepodporuje serializaci, ConvertTo implementace musí vrátit nulla je povoleno vyvolat výjimku v tomto případě. Pokud ale dojde k výjimkám, měli byste informovat o nemožnosti použít tento převod jako součást implementace CanConvertTo , aby se podporoval osvědčený postup kontroly s prvním cílem vyhnout se výjimkám CanConvertTo .

Pokud destinationType parametr není typu String, můžete zvolit vlastní zpracování převaděčů. Obvykle byste se vrátili k základnímu zpracování implementace, které v základu nejvíce ConvertTo vyvolává konkrétní výjimku.

Implementace CanConvertTo

Vaše CanConvertTo implementace by se měla vrátit true pro destinationType typ Stringa jinak odložit základní implementaci.

Implementace CanConvertFrom

Vaše CanConvertFrom implementace by se měla vrátit true pro sourceType typ Stringa jinak odložit základní implementaci.

Použití TypeConverterAttribute

Aby byl váš převaděč vlastních typů použit jako převaděč typu pro fungující typ pro vlastní třídu procesorem XAML, musíte použít definici TypeConverterAttribute třídy. Zadaným ConverterTypeName atributem musí být název typu vašeho vlastního převaděče typů. Při použití tohoto atributu procesor XAML zpracovává hodnoty, ve kterých typ vlastnosti používá váš vlastní typ třídy, může zadávat řetězce a vracet instance objektů.

Můžete také poskytnout převaděč typů pro jednotlivé vlastnosti. Místo použití TypeConverterAttribute definice třídy ji použijte na definici vlastnosti (hlavní definice, nikoli get/set implementace v ní). Typ vlastnosti se musí shodovat s typem, který je zpracován vaším převaděčem vlastního typu. Při použití tohoto atributu, když procesor XAML zpracovává hodnoty této vlastnosti, může zpracovávat vstupní řetězce a vracet instance objektů. Technika převaděče typů vlastností je obzvláště užitečná, pokud se rozhodnete použít typ vlastnosti z rozhraní Microsoft .NET Framework nebo z jiné knihovny, kde nemůžete řídit definici třídy a nelze TypeConverterAttribute ji použít tam.

Viz také