我有一个XAML UserControl,它使用同一项目中包含的转换器。
xmlns:filter="clr-namespace:SampleModuleFilter" - namespace definition
到目前为止一切顺利。但是,当我将转换器移动到另一个程序集并相应地调整名称空间和引用时,我得到以下异常: XamlParseException - “在'System.Windows.Markup.StaticResourceHolder'上提供值引发异常。内部异常声明”方法或操作未实现。“这很奇怪。 移动到另一个库后的命名空间如下所示:
xmlns:filter="clr-namespace:SampleLibrary.Converters;assembly=SampleLibrary"
转换器资源定义是:
<filter:BoolToVisibilityConverter x:Key="boolToVisibilityConverter" />
我这样使用它:
Visibility="{Binding DisplayLabel, Converter={StaticResource ResourceKey=boolToVisibilityConverter}}"
IntelliSense显然可以看到库,因为它工作正常(在我写入命名空间前缀后提供转换器类)。
任何想法可能是什么问题?
答案 0 :(得分:1)
您还必须在代码隐藏文件中引用程序集。
如果仅在XAML部分引用程序集,编译器将返回“无法加载xxx.dll”异常。
您还必须直接调用连接的程序集,如下所示:
var dummy = new MyExternalAssemby.MyType();
或仅在新的代码行中
new MyExternalAssemby.MyType();
不将结果放在虚拟变量中。
通常我在静态构造函数中这样做。 我认为这是XAML解释器中的一个错误,因为XAML没有编译,只是在BAML(二进制XAML)中“翻译”。因此,如果您在XAML中引用某个类型而不在.NET链接器后面的代码中创建“硬”引用,则忽略它。
HTH 洛伦佐
答案 1 :(得分:1)
而不仅仅是:
xmlns:filter="clr-namespace:SampleModuleFilter"
也参考组件
xmlns:filter="clr-namespace:SampleModuleFilter;assembly=SampleModuleFilterAssemblyName"
这应该可以解决问题。
答案 2 :(得分:0)
这很奇怪;我们的转换器都位于中央库中,并且工作正常。假设引用和命名空间是正确的,我唯一可以建议的是清理和重建有问题的两个项目。
答案 3 :(得分:0)
您的代码中某处使用了“SampleLibrary.dll”吗?
我遇到一个奇怪的错误,在编译时会跳过仅在xaml文件中使用的引用程序集,并且不会出现在dll依赖项中。