今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系。比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架:

Windows Forms

先看看Window Forms中的情况,下图为在VS中创建的默认Windows Forms项目结构:

分别回顾一下每个文件以及它们之间的关系:

┣━ Properties------------------------------------------- 项目属性文件夹

┣━━━━━ AssemblyInfo.cs----------------------------------- 程序集信息声明

┣━ App.config------------------------------------------- 应用程序配置文件

┣━ Form1.cs--------------------------------------------- 窗体Form1 类文件

┣━━━━━ Form1.Designer.cs--------------------------------- 窗体Form1设计 类文件

┗━ Program.cs------------------------------------------- 程序入口类文件

这里我们主要关心的就是Form1.cs、Form1.Designer.cs和Program.cs三个文件,下面我用Visio图表示一下执行流程

也就是说,Form1.cs和Form1.Designer.cs最终在编译阶段形成了一个类型,所有的控件的定义和初始化(大多是由于开发者的拖拽和属性编辑操作产生)全部在Form1.Designer.cs这个部分类中完成,代码我就不用贴出来了。我们在开发的时候只需要关心如何在Form1.cs文件中操作部分类中定义的控件成员和编写一些逻辑代码,从而减少开发者的编码量。

说白了,也就是大家常说的前台UI(Form1.Designer.cs)和后台代码(Form1.cs)是部分类的关系,通过partial关键字实现。

Web Forms

再来看看Web Form中又是怎样的一种形式:

这里我们主要是看看WebForm1.aspx、WebForm1.aspx.cs和WebForm1.aspx.designer.cs这三个文件的关系:

我们都应该知道WebForm1.aspx文件最终也是编译成为一个类存放于一个临时的程序集,对于这个类型来讲,它派生自WebForm1.aspx.cs文件中定义的类,也就是说前台UI(WebForm1.aspx)是后台代码(WebForm1.aspx.cs)的子类。那么WebForm1.aspx.designer.cs又是个啥?这里就和WinForms一样了,它和WebForm1.aspx.cs最终也是编译成为一个类型,在WebForm1.aspx.designer.cs也都是定义了一些控件,这也是当年号称很厉害的CodeBehind,目的是将表现和逻辑隔离,当然我们这里不需要评价CodeBehind,本身也不在今天讨论的范畴之中。

Window Phone / WPF

最后来看看WP中怎么设计的:

以上是Visual Studio 2013 Update 4中创建的空白Windows Phone 8.1应用,其中有一个MainPage.xaml和MainPage.xaml.cs文件,那它两又是什么关系呢?难道是和Windows Forms又或是Web Forms一样吗?

答案自然是否定的,首先XAML文件中写的XAML代码实际上就是XML语法,官方的说法:它是一个声明对象的语言,为我们创建对象提供便捷的一种方式。与HTML类似,特点是用来描述用户接口(UI)内容。

通常我们把与xaml文件关联的xaml.cs文件叫作代码隐藏文件。如果你引用xaml中的任何一个事件处理程序(通过事件特性,如Button的Click事件),这里就是我们定义这些事件处理程序的地方。

我们先看看后台代码

 namespace Demo1
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required;
} /// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。
/// 此参数通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: 准备此处显示的页面。 // TODO: 如果您的应用程序包含多个页面,请确保
// 通过注册以下事件来处理硬件“后退”按钮:
// Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
// 如果使用由某些模板提供的 NavigationHelper,
// 则系统会为您处理该事件。
} private void btnHello_Click(object sender, RoutedEventArgs e)
{
txtResult.Text = "Hello World";
var temp = (TextBlock)base.FindName("txtResult");
temp.Text = "Hello World2";
}
}
}

MainPage.cs

对于后台代码文件中定义的类同样也有个partial ,貌似跟Windows Phone有点类似。但是我们找了找整个解决方案并没有发现有一个与之对应的部分类,但是根据CodeLens的提示,我们能发现确实有部分类的存在而且是两个类文件MainPage.g.cs和MainPage.g.i.cs

分别双击打开这个类文件

MainPage.g.cs

 namespace Demo1
{
partial class MainPage : global::Windows.UI.Xaml.Controls.Page, global::Windows.UI.Xaml.Markup.IComponentConnector
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] public void Connect(int connectionId, object target)
{
switch(connectionId)
{
case :
#line 22 "..\..\MainPage.xaml"
((global::Windows.UI.Xaml.Controls.Primitives.ButtonBase)(target)).Click += this.btnHello_Click;
#line default
#line hidden
break;
}
this._contentLoaded = true;
}
}
}

MainPage.g.cs

MainPage.g.i.cs

 namespace Demo1
{
partial class MainPage : global::Windows.UI.Xaml.Controls.Page
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
private global::Windows.UI.Xaml.Controls.Button btnHello;
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
private global::Windows.UI.Xaml.Controls.TextBlock txtResult;
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
private bool _contentLoaded; [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks"," 4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent()
{
if (_contentLoaded)
return; _contentLoaded = true;
global::Windows.UI.Xaml.Application.LoadComponent(this, new global::System.Uri("ms-appx:///MainPage.xaml"), global::Windows.UI.Xaml.Controls.Primitives.ComponentResourceLocation.Application); btnHello = (global::Windows.UI.Xaml.Controls.Button)this.FindName("btnHello");
txtResult = (global::Windows.UI.Xaml.Controls.TextBlock)this.FindName("txtResult");
}
}
}

MainPage.g.i.cs

从这两个文件中我们可以看到,MainPage类在这里还定义了一些控件和相关的方法,并且InitializeComponent()方法里面加载和解析了MainPage.xaml文件MainPage.cs文件里面的MainPage()方面里面调用的InitializeComponent()方法就是在MainPage.g.cs文件里面定义的。在xaml页面中声明的控件,通常会在.g.cs中生成对应控件的内部字段。实际上这取决于控件是否有x:Name属性,只要有这个属性,都会自动调用FindName方法,用于把字段和页面控件关联。没有x:Name属性,则没有字段,这种关联会有一定的性能浪费,因为是在应用载入控件的时候,通过LoadComponents方法关联的,而xaml也是在这个时候动态解析的。

由此我们就会萌生一个动态加载XAML的想法:

我在页面上添加一个按钮,当按钮点击时执行如下代码:

 int top = ;
private void btnHello_Click(object sender, RoutedEventArgs e)
{
string temp = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " +
" Content=\"这是动态加载的按钮\"/>";
Button btnTemp = (Button)XamlReader.Load(temp);
// 设置水平对其方式
btnTemp.HorizontalAlignment = HorizontalAlignment.Center;
// 让Margin每次都变一下
btnTemp.Margin = new Thickness(, top-=, , );
// 动态设置点击事件
btnTemp.Click += btnHello_Click;
grid.Children.Add(btnTemp);
}

动态加载按钮XAML

效果如下图所示:

通过C#创建按钮的形式:

 /// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。
/// 此参数通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: 准备此处显示的页面。 // TODO: 如果您的应用程序包含多个页面,请确保
// 通过注册以下事件来处理硬件“后退”按钮:
// Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
// 如果使用由某些模板提供的 NavigationHelper,
// 则系统会为您处理该事件。 Button btn = new Button();
btn.Content = "代码创建的按钮";
btn.Click += btnHello_Click;
grid.Children.Add(btn);
}

通过C#代码创建控件

虽然我们可以这样创建对象,但是这种形式就丧失我们XAML创建页面元素对象的优势了!

总结一下:XAML只是创建对象的一种便捷方式,类似于一种“命令”的形式,跟后台代码没有关系,只是在后台执行的时候键xaml文件当做资源去载入罢了!

结合这个几个平台来看,认为微软为开发者考虑的太多,有的时候反倒是形成一种“负担”!

关于 WP 开发中.xaml 与.xaml.cs 的关系的更多相关文章

  1. WP 开发中.xaml 与.xaml.cs

    关于 WP 开发中.xaml 与.xaml.cs 的关系   今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: ...

  2. 转自fineui论坛:解决fineui框架开发中的Designer.aspx.cs丢失问题

    在开发的时候碰到个问题,本来好好的Edit.aspx  Edit.aspx.cs  Edit.Designer.aspx.cs编辑Edit.aspx然后保存,编译的时候 发现Edit.aspx.cs里 ...

  3. WP8.1开发中对于XAML中一些语言的学习(1);

    以前在学习WP开发的时候,看到视频中说到程序在创建之初,MainPaige.xaml页面上有一些代码: <Page x:Class="草案.MainPage" xmlns=& ...

  4. Xamarin.Forms移动开发系列4 :XAML基础

    摘要 本文介绍Xamarin.Forms创建用户界面的语言:XAML基础部分. 前言 本文介绍Xamarin.Forms定义用户界面的语言:XAML. 本篇篇幅较长,主要讲述XAML语法,以及对其他基 ...

  5. 【本人译作推荐】Windows 8应用开发:C#和XAML卷(原名:Building Windows 8 Apps with C# and XAML)

    [图书推荐] 译名:Windows 8应用开发:C#和XAML卷 原名:Building Windows 8 Apps with C# and XAML   编辑推荐 国内第一本使用XAML与C#语言 ...

  6. WPF中的Generic.xaml, theme以及custom control

    原文:WPF中的Generic.xaml, theme以及custom control 在Visual Studio中创建自定义控件时,所有控件都将添加到/Themes/Generic.xaml. 最 ...

  7. Xamarin.Forms移动开发系列5 :XAML标记扩展

    摘要 本文主要讲述Xamarin.Forms中XAML的标记扩展. 前言 在Xamarin.Forms移动开发系列4 :XAML基础一文中提到过XAML标记扩展,本文将对标记扩展进行更深入的了解. 大 ...

  8. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  9. 【WP开发】读写剪贴板

    在WP 8.1中只有Silverlight App支持操作剪贴板的API,Runtime App并不支持.不过,在WP 10中也引入了可以操作剪贴板的API. 顺便说点题外话,有人会说,我8.1的开发 ...

随机推荐

  1. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  2. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  3. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  4. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  5. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  6. css text-fill-color与text-stroke讲解

    顾名思义"text-fill-color"就是文字填充颜色而"text-stroke"就是文字描边.还别说,两个属性可以制作出各种炫酷的文字效果,不过IE系列都 ...

  7. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

  8. maven打包插件:appassembler

    1.打包成bat 打包命令:mvn clean package appassembler:assemble <plugin> <groupId>org.codehaus.moj ...

  9. join Linq

    List<Publisher> Publishers = new List<Publisher>(); Publisher publish1 = new Publisher() ...

  10. vim+vundle配置

    Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...