F R*_*ell 3 wpf xaml xamlreader
我有一个WPF项目,AssemblyInfo.cs它将多个CLR名称空间组合到一个XML名称空间中:
[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Controls")]
[assembly: XmlnsDefinition("http://foo.bar", "MyLibary.Converters")]
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
当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
Run Code Online (Sandbox Code Playgroud)
错误消息是:
'Cannot create unknown type '{http://foo.bar}MyConverter'.'
Run Code Online (Sandbox Code Playgroud)
如果所有代码都放在一个共同的CLR命名空间下,一切正常,但不幸的是,这不是选项.是否有人将多个CLR名称空间映射到单个XML名称空间,以便动态加载XAML内容?
提前致谢!
如上面的注释所述,解决方案是在调用XamlReader.Load和删除类型映射器和上下文之前手动加载程序集:
Assembly.Load("MyLibrary");
var rootNode = XamlReader.Load(memeoryStream) as FrameworkElement
Run Code Online (Sandbox Code Playgroud)
我会假设,因为XamlTypeMapper初始化了一个程序集列表,这个类将负责加载程序集(也许它是),但行为AddMappingProccessingInstruction阻止了它的工作.
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |