首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FsXaml类型提供程序相对于XamlReader的优势

FsXaml类型提供程序相对于XamlReader的优势
EN

Stack Overflow用户
提问于 2015-06-16 05:00:28
回答 2查看 323关注 0票数 6

F#不支持部分类,也不支持XAML文件的预编译。解决办法:在运行时加载图形对象定义,而不是编译时代码。有多种方法为XamlReader提供引用资源文件的内容。

代码语言:javascript
复制
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

类型提供程序应该能够将至少一部分工作转移回编译时。

代码语言:javascript
复制
open FsXaml
type MainWindow = XAML<"MainWindow.xaml"> 
let mainwnd = new MainWindow()
let wnd = mainwnd.Root

类型安全性(和发现)方面的增益似乎是微不足道的:每个资源的一个运行时类型强制转换更少。还有其他好处吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-14 18:10:52

类型安全性(和发现)方面的增益似乎是微不足道的:每个资源的一个运行时类型强制转换更少。

这里还有其他优点,即使在您显示的代码中也是如此。在您的示例中,使用FsXaml要简洁得多,并且完全输入安全。如果您的XAML文件中存在重大问题,使用XAML Loader将其延迟到运行时,它也将在编译时失败。

还有其他好处吗?

有很多好处-

  • 短码
  • 类型安全
  • 以类型安全方式公开为属性的命名元素
  • (最重要的是)创建与XAML类型相对应的实际类型

最后一点是FsXaml相对于XamlReader的“杀手”优势--没有它,在WPF中除了“玩具”项目之外,几乎不可能做任何事情。如果您想要嵌入XAML,就需要有与您的类型相对应的“真实类型”。

例如,如果您想使用UserControls作为数据模板进行开发,则需要将该UserControl作为实际类型,而不仅仅是某些XAML作为资源。使用XamlReader,无法从其他XAML引用这一点。您也不能重用资源,不能将数据拖到应用程序中,或者其他许多事情(不需要在运行时手工编写大量管道来完成)。

此外,使用FsXaml 2+,您可以子类类型并在“代码背后”中提供完整的逻辑,这与您在C#中的工作方式类似(尽管不同)。

这使Xaml在C#中工作时的体验更加接近--仍然没有C#编译(这是一个缺点),但否则,在使用F#与WPF一起工作时,您会获得与C#相当的体验。

票数 8
EN

Stack Overflow用户

发布于 2015-06-16 05:51:22

类型提供程序在编译时检查事物,Xaml读取器在运行时工作。

因此,在编译或运行时都会检测到错误。很明显,在开发过程的早期发现错误会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30859148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档