修复XamlobjectWritereXception,无法在F#,FSXAML,WPF App中创建未知类型



我在使用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)
  • 视图项目包含XAML,并包括对C1.WPF.4.dll。
  • 的引用
  • XAML从C1.wpf.4.dll。
  • 声明一个控件的实例
  • 但是,没有F#代码使用C1.wpf.4.dll中的任何类型。
  • 因此,views.dll不包含对c1.wpf.4.dll的引用,如IlSpy。
  • 所确认
  • 因此,当我构建app.exe时,c1.wpf.4.dll不包含在输出文件夹中。
  • 因此,我有一个运行时错误。

虽然我可以在我的应用程序项目中包含对c1.wpf.4.dll的引用,但我宁愿不要。

有更好的方法吗?

使它起作用:

  1. 在XAML文件中,用CLR名称空间替换XAML名称空间。例如,而不是xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml"使用xmlns:c1="clr-namespace:C1.WPF;assembly=C1.WPF.4"之类的东西。

这是必需的,因为当App.exe运行时,它可能还没有加载控件库。正是在控件库中,属性创建了从XAML名称空间到CLR名称空间的映射。通过明确说明CLR名称空间和汇编,XamlReader可以找到可以实例化的类。

  1. 在视图代码中创建一个虚拟实例。虚拟实例是从控件库中的某些实例。这将在controls库上创建依赖项。

    // 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的引用。"

最新更新