修复XamlObjectWriterException,无法在F#,FsXaml,WPF应用中创建未知类型吗?

时间:2019-03-16 21:44:40

标签: wpf fsxaml elmish-wpf

我在用F#,FsXaml和Elmish.WPF构建的WPF应用程序中遇到此错误。

System.Xaml.XamlObjectWriterException:
Cannot create unknown type '{http://schemas.componentone.com/winfx/2006/xaml}C1ProgressIndicator'.
at System.Xaml.XamlObjectWriter.WriteStartObject(XamlType xamlType)
at FsXaml.InjectXaml.from(String file, Boolean loadFromResource, Object root)
  • 一个Views项目包含XAML,并包含对C1.WPF.4.dll的引用。
  • XAML从C1.WPF.4.dll声明控件的实例。
  • 但是,没有F#代码使用C1.WPF.4.dll中的任何类型。
  • 因此,IL Spy证实,Views.dll不包含对C1.WPF.4.dll的引用。
  • 因此,当我构建App.exe时,C1.WPF.4.dll不包含在输出文件夹中。
  • 因此,我遇到了运行时错误。

尽管我可以在我的App项目中包含对C1.WPF.4.dll的引用,但我不希望这样。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

要使其正常工作:

  1. 在XAML文件中,将XAML命名空间替换为CLR命名空间。例如,使用xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"之类的字词代替xmlns:c1="clr-namespace:C1.WPF;assembly=C1.WPF.4"

这是必需的,因为在运行App.exe时,它可能尚未加载控件库。 an attribute是在控件库中创建从XAML命名空间到CLR命名空间的映射。通过显式说明CLR名称空间和程序集,XamlReader可以找到要实例化的类。

  1. 在“视图”代码中创建一个虚拟实例。虚拟实例是控件库中某些内容的实例。这将在控件库的Views.dll中创建依赖项。

    // force the compiler to add a reference to C1.WPF.4.dll
    let private forceC1DllReference = C1.WPF.Anchor.TopLeft
    
    type MainWindowView = XAML< "MainWindow.xaml" >
    

第二个感觉就像是黑客。我想知道是否有更好的说法,“即使我没有使用它的类型,也请添加对此DLL的引用。”