Вручную проанализировать строку как атрибут XAML - PullRequest
3 голосов
/ 31 июля 2009

Как XAML Parser преобразует строку "Red" в Foreground = "Red" в SolidColorBrush? Несмотря на то, что я знаю, что для типов определены System.ComponentModel.TypeConverter, я забыл, что синтаксический анализатор WPF XAML всегда использует их для преобразования строки в кисть. Существуют ли какие-либо API-интерфейсы XAML, кроме XamlReader.Load (который хочет правильную строку XML), которые я мог бы использовать для анализа одной строки, как если бы она находилась в атрибуте определенного свойства?

Ответы [ 2 ]

0 голосов
/ 24 марта 2010

Парсер XAML (для WPF) действительно использует преобразователь типа указанного свойства или типа свойства. Есть несколько жестко закодированных ярлыков, но они предназначены для повышения производительности и не меняют семантику. Синтаксический анализатор, просто используя информацию об атрибутах, может дублировать семантику синтаксического анализатора (например, то, что делают Blend и Cider).

Не существует API, который будет преобразовывать значение точно так же, как XAML, главным образом потому, что многие преобразования типов работают только в контексте синтаксического анализа XAML. Например, преобразователи типов могут ссылаться на пространства имен, определенные в файле XAML (который изменяется в зависимости от того, где находится значение в файле XML), а также на другую базу URI базы внешней информации для файла. Они действительно применимы только при анализе файла XAML.

Самое близкое, к чему вы можете обратиться - запросить дескриптор свойства для свойства из дескриптора типа и использовать свойство Converter. Это отсканирует соответствующие атрибуты для создания правильного конвертера типов.

0 голосов
/ 31 июля 2009

Я верю, что вы можете воспользоваться этим сами. XamlReader знает целевой тип (тип свойства, к которому должна применяться строка). Вы должны зарегистрировать TypeConverter для типа этого свойства.

РЕДАКТИРОВАТЬ это будет работать для вас, когда дело доходит до SolidColorBrush:

var colorString = ...;
var converter = new System.Windows.Media.BrushConverter();
var brush = (SolidColorBrush)converter.ConvertFromString(colorString);

Глядя на SolidColorBrush в .NET Reflector, кажется, что магия, которая делает десериализацию в XamlReader, использует внутренние API вокруг известных типов. Я не уверен, можете ли вы зарегистрировать свои собственные типы, чтобы справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...