C#和XAML在WPF中是如何协同工作的?
C#和XAML在WPF中是如何协同工作的?
在WPF中,XAML是一种用于定义用户界面的标记语言。当我们在XAML中定义了界面元素和布局时,XAML解析器会将其解析并创建相应的CLR对象。XAML解析器是由C#编写的,位于System.Xaml.dll中。但是,C#并不直接调用解析器,它只是一种编程语言。解析器的调用是由WPF应用程序类或编译器完成的。解析器的运行时间可以是编译时、应用程序启动时或运行时的任意时间点。
XAML解析器解析XAML只会进行一次,无论是在编译时、应用程序启动时还是在运行时的任何时间点。XAML解析器并不直接创建CLR对象,而是根据解析出的解析树,由WPF应用程序创建对象(例如框架元素等)。
关于XAML是否编译成BAML的问题,实际上没有固定的答案。XAML可以编译成BAML,也可以不编译。无论如何,XAML最终都会被解析器解析,并创建相应的CLR对象。
至于事件是否只能触发C#代码,XAML是否只在显示窗体时才被执行,这样的观点是错误的。事件并不仅仅触发C#代码,而是会触发相应的事件处理程序。而XAML的解析只会进行一次,无论是在显示窗体时还是其他时间点。
C#和XAML在WPF中是通过XAML解析器的解析和CLR对象的创建来协同工作的。XAML解析器由C#编写,解析XAML并创建CLR对象,这些对象最终被用于构建WPF应用程序的用户界面。
在这段对话中,问题的出现可以追溯到对C#和XAML在WPF中如何一起使用的疑问。通过阅读给出的链接,可以得出以下原因和解决方法:
问题的原因:
提问者对于C#和XAML在WPF中的工作方式不太清楚,特别是对于InitializeComponent和XAML解析的关系不明确。
解决方法:
通过查看给出的链接和相关资料,可以得到以下解决方法:
1. WPF应用程序的生命周期和XAML解析的过程可以参考MSDN的文档《WPF应用程序和其生命周期》,链接为http://msdn.microsoft.com/en-us/library/ms743714.aspx。
2. InitializeComponent方法在XAML解析中起到了重要的作用,它将XAML与代码绑定在一起。更多关于InitializeComponent的信息可以参考Stack Overflow上的问题《What does InitializeComponent() do, and how does it work in WPF?》,链接为https://stackoverflow.com/questions/245825。
3. XAML文件的解析过程是由标记编译器完成的,生成了一个编译后的表示,并复制到obj\Release文件夹中。同时,为每个XAML文件生成了一个特定语言的代码文件。例如,在Visual Basic项目中的Page1.xaml页面会生成一个Page1.g.vb文件,在C#项目中的Page1.xaml页面会生成一个Page1.g.cs文件。这些文件是为了XAML文件中的顶级元素(如Page或Window)生成的部分类声明。这个类是使用C#中的partial修饰符(在Visual Basic中是Extends)声明的,用于指示该类的另一个声明通常在代码后台文件Page1.xaml.cs中。
4. 在WPF中,XAML部分只有在JIT显示窗体时才会执行,类似于WPF中的"InitializeComponent"。在WinForms中,没有明确区分InitializeComponent和事件处理程序,它们都是使用C#编写的方法。因此,在WPF中使用XAML来实现这些功能。
通过阅读Nick的帖子,可以更好地理解WPF的工作原理。WPF根据XAML标记生成一个部分类(常规的C#或VB),其中包含控件名称和事件。这个部分类将与代码后台文件匹配。因此,可以说WPF间接使用了XAML。
如果感兴趣,可以通过查看obj文件夹中生成的类来自行查看生成的类。
C#和XAML在WPF中是如何一起工作的?
在WPF中,C#和WinForms的流程并没有太大的不同。消息泵将调用C#事件处理程序,并且窗体的初始化将在一个InitializeComponent方法中完成。唯一的区别在于,WPF窗体的InitializeComponent方法将包括解析XAML文件,因此开发人员使用XAML而不是C#来描述窗体的初始外观。
那么XAML是在运行时解析的吗?我原以为它会在编译时被编译成IL或本机代码。
在这里找到了答案:blogs.microsoft.co.il/tomershamam/2007/05/25/…。这个链接已经失效。
对我来说链接还是有效的。无论如何,你可以尝试使用缓存版本:webcache.googleusercontent.com/…。