据我所知,XAML 中的所有操作都可以用 C# 实现。
为什么 XAML 要编译成 BAML 而不是 C#?将 XAML 在编译时解析并创建相应的 C# 代码不是更高效吗?
本博客将提供全面的答案: http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/05/25/Compiled-XAML-3D00-BAML-not-IL.aspx
昨天我讲解了XAML,接下来有一个问题:为什么XAML要编译成BAML而不是直接编译成IL以获得更好的性能呢?
在给出正确答案之前,我想先解释一下BAML是什么。
处理XAML文件有两种方法:松散或编译过的。
- 松散的XAML文件应在运行时解析,并可作为简单的XML文件本地、远程或嵌入到程序集中部署。
- 已编译的XAML文件标记为“Page”(在MSBuild中),部署为BAML(二进制应用程序标记语言)文件并作为程序集资源嵌入。
松散的XAML文件不能包含x:Class XAML关键字,也无法嵌入源代码,也不能通过任何方式发出代码。可以通过调用XamlReader.Load()方法并将返回值转换为根元素来加载松散的XAML文件版本。松散的XAML版本提供了一种动态加载和更改视图的方法,但由于XML文件在运行时解析,因此性能较差。
已编译的XAML文件(BAML)可以通过使用x:Class或注册事件来发出代码。可以通过调用Application.LoadComponent()从BAML中加载元素,并将返回值转换为根元素。编译后的XAML版本提供了更好的性能,因为它是预先标记化的二进制XAML文件版本,因此更小且加载速度更快,但不具备动态性。
从前有一种语言叫做CAML。CAML是XAML文件编译后的精确IL版本。不过,WPF团队已决定淘汰它,保留BAML版本,这是出于以下原因:
- BAML更为紧凑,因此可以更快地下载(对于XBAP应用程序来说是优势)
- BAML比代码执行更少安全威胁(对于XBAP应用程序来说是优势)
- BAML可以在编译之后进行本地化
总的来说,BAML虽然稍慢于IL,但比CAML具有更多优势。
Xaml与C#代码分离是为了让这些元素可以进行“软编码”。如果将Xaml编译为C#代码,就会破坏这个特性,因为现在UI元素、数据绑定、事件等都已经硬编码到程序中,如果要对用户界面进行微小的更改,就需要重新编译整个程序。
Petr k. 引用的博客文章指出,Xaml曾经被编译成IL,但现在使用Baml是因为:
理论上,所有的XAML都可以编译成等效的C#代码(尽管在实践中使用BAML)。
请查看http://xamlgenerator.codeplex.com/上的XAML Code Behind Generator。
这是Visual Studio 2010的一个插件,允许您将XAML编译成等效的C#代码,非常有趣,可以让您了解XAML如何被编译成C#。
x:Name
属性时为您的代码后台生成私有成员。否则,您的代码后台将无法编译。请注意,ResourceDictionary
没有代码后台,因此不会生成g.cs文件。 - Emperor Eto