F#不支持部分类,也不支持XAML文件的预编译。解决办法:在运行时加载图形对象定义,而不是编译时代码。有多种方法为XamlReader提供引用资源文件的内容。
open System.Windows
// from Resource
let uri = System.Uri "pack://application:,,,/AssemblyName;component/MainWindow.xaml"
let info = Application.GetResourceStream uri
let wnd = Markup.XamlReader.Load info.Stream :?> Window
// from Embedded resource
let assembly = System.Reflection.Assembly.GetExecutingAssembly()
let stream = assembly.GetManifestResourceStream "MainWindow.xaml"
let wnd = Markup.XamlReader.Load stream :?> Window类型提供程序应该能够将至少一部分工作转移回编译时。
open FsXaml
type MainWindow = XAML<"MainWindow.xaml">
let mainwnd = new MainWindow()
let wnd = mainwnd.Root类型安全性(和发现)方面的增益似乎是微不足道的:每个资源的一个运行时类型强制转换更少。还有其他好处吗?
发布于 2016-06-14 18:10:52
类型安全性(和发现)方面的增益似乎是微不足道的:每个资源的一个运行时类型强制转换更少。
这里还有其他优点,即使在您显示的代码中也是如此。在您的示例中,使用FsXaml要简洁得多,并且完全输入安全。如果您的XAML文件中存在重大问题,使用XAML Loader将其延迟到运行时,它也将在编译时失败。
还有其他好处吗?
有很多好处-
最后一点是FsXaml相对于XamlReader的“杀手”优势--没有它,在WPF中除了“玩具”项目之外,几乎不可能做任何事情。如果您想要嵌入XAML,就需要有与您的类型相对应的“真实类型”。
例如,如果您想使用UserControls作为数据模板进行开发,则需要将该UserControl作为实际类型,而不仅仅是某些XAML作为资源。使用XamlReader,无法从其他XAML引用这一点。您也不能重用资源,不能将数据拖到应用程序中,或者其他许多事情(不需要在运行时手工编写大量管道来完成)。
此外,使用FsXaml 2+,您可以子类类型并在“代码背后”中提供完整的逻辑,这与您在C#中的工作方式类似(尽管不同)。
这使Xaml在C#中工作时的体验更加接近--仍然没有C#编译(这是一个缺点),但否则,在使用F#与WPF一起工作时,您会获得与C#相当的体验。
发布于 2015-06-16 05:51:22
类型提供程序在编译时检查事物,Xaml读取器在运行时工作。
因此,在编译或运行时都会检测到错误。很明显,在开发过程的早期发现错误会更好。
https://stackoverflow.com/questions/30859148
复制相似问题