XamlReader - отображение нескольких пространств имен CLR в одно пространство имен XML - PullRequest
3 голосов
/ 24 ноября 2011

У меня есть проект WPF с AssemblyInfo.cs, который группирует несколько пространств имен CLR в одно пространство имен XML:

[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Controls")]
[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Converters")]

В XAML это используется следующим образом:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:fb="http://foo.bar">
    <fb:FooButton IsEnabled="{Binding Something, Converter={fb:FooConverter}}"/>
</UserControl>

Это прекрасно работает, когда XAML создается нормально, но теперь я пытаюсь динамически загружать файлы XAML из моего проекта, используя XamlReader.

Проблема: мне не удается отобразить несколько пространств имен CLR вединое пространство имен XML.Похоже, что последнее определение, добавленное к XamlTypeMapper, является единственным, которое сохраняется (например, оно перекрывает предыдущие регистрации):

var parserContext = new ParserContext();
parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
parserContext.XmlnsDictionary.Add("fb", "http://foo.bar");

parserContext.XamlTypeMapper = new XamlTypeMapper(new string[] {"MyLibrary"});
parserContext.XamlTypeMapper.AddMappingProcessingInstruction("http://foo.bar", "MyLibrary.Converters", "MyLibrary");
parserContext.XamlTypeMapper.AddMappingProcessingInstruction("http://foo.bar", "MyLibrary.Controls", "MyLibrary");

...

var rootNode = XamlReader.Load(memeoryStream, parserContext) as FrameworkElement

Сообщение об ошибке:

'Cannot create unknown type '{http://foo.bar}MyConverter'.'

Есливсе помещают весь мой код в одно общее пространство имен CLR, все работает, но, к сожалению, это не вариант.Кто-нибудь отображал несколько пространств имен CLR в одно пространство имен XML с целью динамической загрузки содержимого XAML?

Заранее спасибо!

1 Ответ

5 голосов
/ 24 ноября 2011

Как упомянуто в комментариях выше, решение состоит в том, чтобы вручную загрузить сборку перед вызовом XamlReader.Load и удалением сопоставления типов и контекста вместе:

Assembly.Load("MyLibrary");
var rootNode = XamlReader.Load(memeoryStream) as FrameworkElement

Я бы предположил, так как XamlTypeMapper инициализируется списком сборок, что этот класс будет отвечать за загрузку сборки (и, возможно, так оно и есть), но поведение AddMappingProccessingInstruction мешает этому работать.

...