Windows Phone 开发学习笔记(四) Hello Windows Phone之心有灵犀
2012-04-22 12:20
741 查看
经过上一篇对页面布局的调整,对XAML文件有点了解。不过在看XAML文件和它对应的CS文件时发现一个问题:XAML文件与CS文件中控件的名称是共用的。而在CS文件中没有看到像using MainPage.xaml或者其他特别的语句,难道CS文件与XAML文件心有灵犀?下面是MainPage.xaml.cs文件的主要代码:
VS自动转到一个名为MainPage.g.i.cs的文件,它的代码如下:
到这里才有点明白,MainPage类的定义其实被分别放在MainPage.xaml.cs和MainPage.g.i.cs中,而MainPage.xaml文件在构造MainPage类时才会被载入。看来XAML文件和CS文件的变量名能共用只不过是表面现象,貌合神离啊。既然这样,如果我更改MainPage.g.i.cs和MainPage.xaml.cs里的代码,让MainPage类里成员名称统一,那么就算CS文件和XAML文件里的控件名称不同,程序还是能正常运行。
做个实验验证一下。将MainPage.xaml.cs和MainPage.g.i.cs里HelloText控件的名称都改为HelloText1,按F5开始调试,正常运行,看来推测是正确的。不过在调试过程中却弹出如下对话框:
提示MainPage.g.i.cs被更改,需要重新载入。可是在调试过程中我什么都没做,为什么会出现这个提示呢?点击Yes发现,MainPage.g.i.cs里控件的名称又变得和XAML一样了。看来这个改变和XAML文件脱不了关系。之前只顾上看MainPage.g.i.cs的代码,没注意它从哪冒出来的。接下来关注下另一方,XAML。
在对XAML文件的主要代码进行分析时,曾经掐头去尾一部分。尾巴只是注释,不用管。头那部分就是下面的代码:
http://msdn.microsoft.com/zh-cn/library/cc189082(v=VS.95).aspx
简单的说,这个属性用来配置标记分部类(markup partial class)和功能分部类(code partial class)的联接,而标记分部类是VS根据XAML文件自动生成的。又是VS,幕后英雄啊。对MainPage来说,MainPage.g.i.cs里的类是标记分部类,MainPage.xaml.cs里的类是功能分部类。编译时,它们组合成MainPage类。整个过程整理为下图:
虽然解决了开始的问题,不过对MainPage.xaml“头”的研究只不过才刚开始,里面还有很多东西需要挖掘。
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); } private void ShowMessage_Click(object sender, RoutedEventArgs e) { HelloText.Text = "Hello Windows Phone"; } } }首先要关注的是MainPage类的构造函数,因为其中包含类的初始化过程,看看它具体做了什么。双击选中InitializeComponent,右击选择Go to Definition。
VS自动转到一个名为MainPage.g.i.cs的文件,它的代码如下:
namespace HelloWindowsPhone { public partial class MainPage : Microsoft.Phone.Controls.PhoneApplicationPage { internal System.Windows.Controls.Grid LayoutRoot; internal System.Windows.Controls.Grid MessagePanel; internal System.Windows.Controls.TextBlock HelloText; internal System.Windows.Controls.Button ShowMessage; private bool _contentLoaded; /// <summary> /// InitializeComponent /// </summary> [System.Diagnostics.DebuggerNonUserCodeAttribute()] public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; System.Windows.Application.LoadComponent(this, new System.Uri("/HelloWindowsPhone;component/MainPage.xaml", System.UriKind.Relative)); this.LayoutRoot = ((System.Windows.Controls.Grid)(this.FindName("LayoutRoot"))); this.MessagePanel = ((System.Windows.Controls.Grid)(this.FindName("MessagePanel"))); this.HelloText = ((System.Windows.Controls.TextBlock)(this.FindName("HelloText"))); this.ShowMessage = ((System.Windows.Controls.Button)(this.FindName("ShowMessage"))); } } }看来在构造MainPage实例时,首先检测内容是否已经载入,如果没有载入,那么就开始解析对应的XAML文件,根据XAML文件初始化各个控件。
到这里才有点明白,MainPage类的定义其实被分别放在MainPage.xaml.cs和MainPage.g.i.cs中,而MainPage.xaml文件在构造MainPage类时才会被载入。看来XAML文件和CS文件的变量名能共用只不过是表面现象,貌合神离啊。既然这样,如果我更改MainPage.g.i.cs和MainPage.xaml.cs里的代码,让MainPage类里成员名称统一,那么就算CS文件和XAML文件里的控件名称不同,程序还是能正常运行。
做个实验验证一下。将MainPage.xaml.cs和MainPage.g.i.cs里HelloText控件的名称都改为HelloText1,按F5开始调试,正常运行,看来推测是正确的。不过在调试过程中却弹出如下对话框:
提示MainPage.g.i.cs被更改,需要重新载入。可是在调试过程中我什么都没做,为什么会出现这个提示呢?点击Yes发现,MainPage.g.i.cs里控件的名称又变得和XAML一样了。看来这个改变和XAML文件脱不了关系。之前只顾上看MainPage.g.i.cs的代码,没注意它从哪冒出来的。接下来关注下另一方,XAML。
在对XAML文件的主要代码进行分析时,曾经掐头去尾一部分。尾巴只是注释,不用管。头那部分就是下面的代码:
x:Class="HelloWindowsPhone.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True">感觉唯一与CS文件有关系的就是第一行:
x:Class="HelloWindowsPhone.MainPage"因此请出MSDN解答。搜索xaml x Class,第一条就是关于这条语句的介绍
http://msdn.microsoft.com/zh-cn/library/cc189082(v=VS.95).aspx
简单的说,这个属性用来配置标记分部类(markup partial class)和功能分部类(code partial class)的联接,而标记分部类是VS根据XAML文件自动生成的。又是VS,幕后英雄啊。对MainPage来说,MainPage.g.i.cs里的类是标记分部类,MainPage.xaml.cs里的类是功能分部类。编译时,它们组合成MainPage类。整个过程整理为下图:
虽然解决了开始的问题,不过对MainPage.xaml“头”的研究只不过才刚开始,里面还有很多东西需要挖掘。
相关文章推荐
- Windows Phone 开发学习笔记(七) Hello Windows Phone之有始有终
- Windows Phone 开发学习笔记(六) Hello Windows Phone之生死有命
- Windows Phone 开发学习笔记(二) Hello Windows Phone之不费功夫
- Windows Phone 开发学习笔记(五) Hello Windows Phone之虎头蛇尾
- Windows Phone 开发学习笔记(八) Hello Windows Phone之本性难移
- Windows Phone 开发学习笔记(三)Hello Windows Phone之深藏不露
- Silverlight for Windows Phone 开发学习笔记(-)
- Windows驱动程序开发学习笔记(一) - 下载并安装WDK
- Android百度地图开发学习笔记(一)之HelloMap地图显示学习心得
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第19讲_js运行原理_js开发工具介绍_js程序(hello)_js基本语法_学习笔记_源代码图解_PPT文档整理
- Windows 8 Metro 开发学习笔记一:新的TextBox控件与换行符
- Windows 8 Directx 开发学习笔记(十四)使用几何着色器实现三角形细分
- Windows Phone 8 学习志(探索问题一:如何简单利用Windows Phone Runtime Component项目类型实现C#和C++交互)
- Windows游戏开发学习笔记之一
- Windows 8 DirectX 开发学习笔记(十六)使用Terragen生成自然环境贴图
- Windows Phone 开发(一):入门指南 — 安装开发环境:Windows Phone SDK
- cocos2d-x 2.1.4学习笔记01:windows平台搭建cocos2d-x开发环境
- Windows 8 Directx 开发学习笔记(二)建立模型及初始化设备
- Windows Phone 手机应用程序开发(二)Hello Windwos Phone (1)
- 第一章Hello Windows Phone 7之Windows Phone 7目标(Programming Windows Phone 7基础篇)