gpt4 book ai didi

wpf - XamlReader - 将多个 CLR 命名空间映射到单个 XML 命名空间

转载 作者:行者123 更新时间:2023-12-02 03:58:25 25 4
gpt4 key购买 nike

我有一个带有 AssemblyInfo.cs 的 WPF 项目,它将多个 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 正常实例化时,这非常有效,但现在我正在尝试使用 XamlReader 从我的项目动态加载 XAML 文件。

问题:我似乎无法将多个 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'.'

如果将我的所有代码都放在一个公共(public) CLR 命名空间下,则一切正常,但不幸的是这不是选项。有人为了动态加载 XAML 内容而将多个 CLR 命名空间映射到单个 XML 命名空间吗?

提前致谢!

最佳答案

正如上面的评论中提到的,解决方案是在调用 XamlReader.Load 之前手动加载程序集并一起删除类型映射器和上下文:

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

我会假设,由于 XamlTypeMapper 是使用程序集列表初始化的,因此此类将负责加载程序集(也许确实如此),但 AddMappingProccessingInstruction< 的行为 阻止此操作。

关于wpf - XamlReader - 将多个 CLR 命名空间映射到单个 XML 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8251423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com