Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Konwertery typów dostarczają logikę dla modułu, który zapisuje obiekty i konwertuje ciąg z notacji XAML na określone obiekty w grafie obiektów. W usługach XAML dla platformy .NET konwerter typów musi być klasą dziedziczącą z TypeConverter. Niektóre konwertery obsługują również ścieżkę zapisu XAML i mogą służyć do serializacji obiektu w postać ciągu znaków w języku znaczników serializacji. W tym temacie opisano sposób i moment wywoływania konwerterów typów w języku XAML oraz zawarto wskazówki dotyczące implementacji przesłonięć metod TypeConverter.
Pojęcia dotyczące konwersji typów
W poniższych sekcjach opisano podstawowe pojęcia dotyczące sposobu używania ciągów przez język XAML oraz sposobu używania konwerterów typów w usługach .NET XAML do przetwarzania niektórych wartości ciągów napotkanych w źródle XAML.
XAML i wartości typu string
Po ustawieniu wartości atrybutu w pliku XAML początkowy typ tej wartości jest ciągiem w ogólnym sensie i wartością atrybutu ciągu w sensie XML. Nawet inne elementy pierwotne, takie jak Double , są początkowo ciągami do procesora XAML.
W większości przypadków procesor XAML potrzebuje dwóch informacji, aby przetworzyć wartość atrybutu. Pierwszy element informacji jest typem wartości właściwości, która jest ustawiana. Każdy ciąg, który definiuje wartość atrybutu i który jest przetwarzany w języku XAML, musi zostać ostatecznie przekonwertowany lub rozpoznany na wartość tego typu. Jeśli wartość jest elementem pierwotnym zrozumiałym dla analizatora XAML (na przykład wartością liczbową), podejmowana jest bezpośrednia konwersja ciągu. Jeśli wartość atrybutu odwołuje się do wyliczenia, podany ciąg jest sprawdzany pod kątem dopasowania nazwy do nazwanej stałej w tym wyliczenie. Jeśli wartość nie jest zrozumiałym elementem pierwotnym lub stałą nazwą z wyliczenia, odpowiedni typ musi mieć możliwość podania wartości lub odwołania opartego na przekonwertowanym ciągu.
Uwaga / Notatka
Dyrektywy języka XAML nie używają konwerterów typów.
Konwertery typów i rozszerzenia znaczników
Użycie rozszerzeń znaczników musi być obsługiwane przez procesor XAML przed sprawdzeniem typu właściwości i innych zagadnień. Jeśli na przykład właściwość ustawiana jako atrybut zwykle ma konwersję typu, ale w konkretnym przypadku jest ustawiana przez użycie rozszerzenia znaczników, to najpierw przetwarzane jest zachowanie rozszerzenia znaczników. Jedną z typowych sytuacji, w których konieczne jest rozszerzenie znaczników, jest utworzenie odwołania do obiektu, który już istnieje. W tym scenariuszu konwerter typów bezstanowych może wygenerować tylko nowe wystąpienie, co może nie być pożądane. Aby uzyskać więcej informacji na temat rozszerzeń znaczników, zobacz Rozszerzenia znaczników dla języka XAML — omówienie.
Konwertery typów natywnych
W implementacjach usług Windows Presentation Foundation (WPF) i .NET XAML istnieją pewne typy CLR, które mają natywną obsługę konwersji typów. Jednak te typy CLR nie są tradycyjnie uważane za pierwotne. Przykładem takiego typu jest DateTime. Jednym z powodów jest sposób działania architektury programu .NET Framework: typ DateTime jest zdefiniowany w bibliotece mscorlib, czyli najbardziej podstawowej biblioteki na platformie .NET. DateTime nie można przypisać atrybutowi pochodzącemu z innego zestawu, który wprowadza zależność (TypeConverterAttribute pochodzi z Systemu). W związku z tym nie można obsługiwać typowego mechanizmu wykrywania konwertera typów za pomocą atrybutów. Zamiast tego analizator XAML zawiera listę typów, które wymagają przetwarzania natywnego, i przetwarza te typy podobne do sposobu przetwarzania prawdziwych elementów pierwotnych. W przypadku DateTime, przetwarzanie obejmuje wywołanie Parse.
Implementowanie konwertera typów
W poniższych sekcjach omówiono interfejs API TypeConverter klasy .
KonwerterTypów
W obszarze Usługi XAML platformy .NET wszystkie konwertery typów używane do celów XAML to klasy pochodzące z klasy TypeConverterbazowej . Klasa TypeConverter istniała w wersjach programu .NET Framework, zanim istniał język XAML. Jednym z oryginalnych TypeConverter scenariuszy było zapewnienie konwersji ciągów dla edytorów właściwości w projektantach wizualizacji.
W przypadku języka XAML rola TypeConverter jest rozszerzana. Dla celów XAML, TypeConverter jest klasą bazową zapewniającą obsługę niektórych konwersji z ciągu na ciąg i na odwrót. Funkcja from-string umożliwia analizowanie wartości atrybutu ciągu z języka XAML. To-string może umożliwić przetwarzanie wartości czasu wykonywania określonej właściwości obiektu z powrotem do atrybutu w języku XAML na potrzeby serializacji.
TypeConverter Definiuje czterech członków, którzy są istotni do konwersji na ciąg znaków i z ciągu znaków na potrzeby przetwarzania XAML.
Spośród tych elementów członkowskich najważniejszą metodą jest ConvertFrom, która konwertuje ciąg wejściowy na wymagany typ obiektu. Metodę ConvertFrom można zaimplementować, aby przekonwertować szerszy zakres typów na zamierzony typ docelowy konwertera. W związku z tym może ona służyć do celów wykraczających poza język XAML, takich jak obsługa konwersji w czasie wykonywania. Jednak w przypadku użycia języka XAML ważna jest tylko ścieżka kodu, która może przetwarzać String dane wejściowe.
Drugą najważniejszą metodą jest ConvertTo. Jeśli aplikacja jest konwertowana na reprezentację znaczników (na przykład, jeśli jest zapisywana do pliku w języku XAML), ConvertTo bierze udział w większym scenariuszu użycia pisarza tekstu XAML w celu utworzenia reprezentacji znaczników. W takim przypadku ważna ścieżka dla XAML jest wtedy, gdy wywołujący przekazuje argument destinationType
String.
CanConvertTo i CanConvertFrom są metodami wspierającymi, które są używane, gdy usługa wykonuje zapytanie o możliwości implementacji TypeConverter. Należy zaimplementować te metody, aby wrócić true
do przypadków specyficznych dla typu, które są obsługiwane przez równoważne metody konwersji konwertera. Dla celów XAML oznacza to zazwyczaj typ String.
Konwertery typów i informacji o kulturze dla XAML
Każda implementacja TypeConverter może w unikalny sposób interpretować, co jest prawidłowym ciągiem znaków do konwersji, i może również używać lub ignorować opis typu, który jest przekazywany jako parametr. Ważnym aspektem dotyczącym konwersji typów i kultury w XAML jest następujący: choć używanie lokalizowalnych ciągów jako wartości atrybutów jest wspierane przez XAML, nie można korzystać z tych zlokalizowanych ciągów jako danych wejściowych dla konwertera typów z określonymi wymaganiami kulturowymi. To ograniczenie jest spowodowane tym, że konwertery typów dla wartości atrybutów XAML wiążą się z zachowaniem przetwarzania XAML w stałym języku, które używa en-US
jako kultury. Aby uzyskać więcej informacji o przyczynach projektowania tego ograniczenia, zobacz specyfikację języka XAML ([MS-XAML]) lub Omówienie globalizacji i lokalizacji WPF.
Jako przykład, w którym kultura może być problemem, niektóre kultury używają przecinka zamiast kropki jako ogranicznika punktów dziesiętnych dla liczb w postaci ciągu. To zastosowanie koliduje z zachowaniem, które mają wiele istniejących konwerterów typów, co polega na użyciu przecinka jako ogranicznika. Przekazywanie kultury xml:lang
w otaczającym języku XAML nie rozwiązuje problemu.
Implementowanie ConvertFrom
Aby można było używać go jako implementacji obsługującej XAML, metoda TypeConverter tego konwertera musi akceptować ciąg jako parametr ConvertFrom. Jeśli ciąg ma prawidłowy format i może zostać przekonwertowany przez TypeConverter implementację, zwracany obiekt musi obsługiwać rzutowanie do typu oczekiwanego przez właściwość . W przeciwnym razie implementacja ConvertFrom musi zwrócić wartość null
.
Każda implementacja TypeConverter może jednoznacznie interpretować, co stanowi prawidłowy ciąg konwersji, a także używać lub ignorować opis typu lub konteksty kultury, które są przekazywane jako parametry. Jednak przetwarzanie WPF XAML może nie przekazywać wartości do kontekstu opisu typu we wszystkich przypadkach, a także może nie przekazywać kultury na podstawie xml:lang
.
Uwaga / Notatka
Nie używaj nawiasów klamrowych ({}), szczególnie otwierającego nawiasu ({), jako elementu formatu ciągu. Te znaki są zarezerwowane jako wejście i wyjście dla sekcji rozszerzenia znaczników.
Należy zgłosić wyjątek, jeśli konwerter typów musi mieć dostęp do usługi XAML za pośrednictwem pisarza obiektów usług XAML w platformie .NET, ale wywołanie GetService względem kontekstu nie zwraca tej usługi.
Implementowanie narzędzia ConvertTo
ConvertTo jest potencjalnie używany do obsługi serializacji. Obsługa serializacji za pośrednictwem ConvertTo dla typu niestandardowego i konwertera typów nie jest absolutnym wymaganiem. Jeśli jednak implementujesz kontrolkę lub używasz serializacji w ramach funkcji lub projektu klasy, należy zaimplementować element ConvertTo.
Aby używać go jako implementacji TypeConverter, która obsługuje język XAML, metoda ConvertTo dla tego konwertera musi akceptować typ (lub wartość), który jest obsługiwany jako parametr value
. Gdy parametr destinationType
ma typ String, zwracany obiekt musi być możliwy do rzutowania na String. Zwrócony ciąg musi reprezentować serializowaną wartość value
. W idealnym przypadku wybrany format serializacji powinien mieć możliwość wygenerowania tej samej wartości, co w przypadku przekazania tego ciągu do ConvertFrom implementacji tego samego konwertera bez znacznej utraty informacji.
Jeśli nie można serializować wartości lub konwerter nie obsługuje serializacji, implementacja ConvertTo musi zwrócić null
i może zgłosić wyjątek. Jeśli jednak zgłaszasz wyjątki, powinieneś zgłosić brak możliwości użycia tej konwersji w ramach implementacji CanConvertTo, aby wspierać najlepszą praktykę polegającą na wcześniejszym sprawdzaniu za pomocą CanConvertTo w celu uniknięcia wyjątków.
destinationType
Jeśli parametr nie jest typu String, możesz wybrać własną obsługę konwertera. Zazwyczaj wracasz do podstawowej obsługi implementacji, która w podstawie ConvertTo zgłasza określony wyjątek.
Należy zgłosić wyjątek, jeśli konwerter typów musi mieć dostęp do usługi XAML za pośrednictwem pisarza obiektów usług XAML w platformie .NET, ale wywołanie GetService względem kontekstu nie zwraca tej usługi.
Implementowanie elementu CanConvertFrom
Twoja implementacja CanConvertFrom powinna zwracać true
dla sourceType
typu String, a w przeciwnym razie przekazać do implementacji podstawowej. Nie zgłaszaj wyjątków z CanConvertFrom.
Implementowanie elementu CanConvertTo
Twoja implementacja CanConvertTo powinna zwracać true
dla destinationType
typu String, a w innych przypadkach odwoływać się do implementacji podstawowej. Nie zgłaszaj wyjątków z CanConvertTo.
Stosowanie atrybutu TypeConverterAttribute
Aby niestandardowy konwerter typów był używany jako działający konwerter typów dla niestandardowej klasy przez usługi XAML platformy .NET, należy zastosować element TypeConverterAttribute do definicji klasy. ConverterTypeName określony za pomocą atrybutu musi być nazwą typu Twojego niestandardowego konwertera typów. Jeśli zastosujesz ten atrybut, gdy procesor XAML obsługuje wartości, w których typ właściwości używa niestandardowego typu klasy, może on wprowadzać ciągi i zwracać wystąpienia obiektów.
Można również podać konwerter typów na podstawie właściwości. Zamiast stosować TypeConverterAttribute do definicji klasy, zastosuj go do definicji właściwości (do głównej definicji, a nie do implementacji get
/set
w jej zakresie). Typ właściwości musi być zgodny z typem przetwarzanym przez konwerter typów niestandardowych. Po zastosowaniu tego atrybutu, gdy procesor XAML obsługuje wartości tej właściwości, może przetwarzać ciągi wejściowe i zwracać wystąpienia obiektów. Technika konwertera typów dla właściwości jest przydatna, jeśli zdecydujesz się użyć typu właściwości z programu Microsoft .NET Framework lub innej biblioteki, w której nie można kontrolować definicji klasy i nie można jej zastosować TypeConverterAttribute .
Aby podać zachowanie konwersji typu dla niestandardowego dołączonego elementu członkowskiego, zastosuj TypeConverterAttribute się do Get
metody dostępu wzorca implementacji dla dołączonego elementu członkowskiego.
Uzyskiwanie dostępu do kontekstu dostawcy usług z implementacji rozszerzenia składniowego
Dostępne usługi są takie same dla każdego konwertera wartości. Różnica polega na tym, jak każdy konwerter wartości odbiera kontekst usługi. Uzyskiwanie dostępu do usług oraz opis dostępnych usług znajdują się w temacie Type Converters and Markup Extensions for XAML.
Konwertery typów w strumieniu węzła XAML
Jeśli pracujesz ze strumieniem węzłów XAML, działania lub wyniki końcowe nie zostały jeszcze wykonane przez konwerter typów. W ścieżce ładowania ciąg atrybutu, który ostatecznie musi zostać przekonwertowany na typ w celu załadowania, pozostaje wartością tekstową w elemencie początkowym i elemencie końcowym. Konwerter typów, który jest ostatecznie potrzebny do tej operacji, można określić za pomocą XamlMember.TypeConverter właściwości . Jednak uzyskanie prawidłowej wartości XamlMember.TypeConverter zależy od kontekstu schematu XAML, który może uzyskać dostęp do takich informacji za pośrednictwem bazowego elementu członkowskiego lub typu wartości obiektu używanej przez element członkowski. Aby wywołać zachowanie konwersji typów, potrzebny jest również kontekst schematu XAML, ponieważ wiąże się to z mapowaniem typów i utworzeniem instancji konwertera.
Zobacz także
- TypeConverterAttribute
- Konwertery typów i rozszerzenia znaczników dla XAML
-
przeglądu XAML (WPF .NET)
.NET Desktop feedback