代号Longhorn:第一眼看在下一代Windows中编写和部署应用程序

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

代号Longhorn:在下一代Windows中编写和部署应用程序

原著: Dino Esposito

翻译:yy2better

原文出处:MSDN Magazine Jan 2004(Code Name Longhorn)

下载关于此文章的代码Longhorn.exe(113KB)

本文内容基于微软专业开发人员大会前夕所生成的代号为“Longhorn”的微软 Windows 操作系统。这里包含的所有信息都有可能改变。

注:本文是在“Longhorn”

Windows产品发布前写出来的,所以,我们不保证此文包含的任何细节与正式售卖品完全一致。本文付诸印刷时,所有描述该产品的信息仅能应用于计划目的。有关信息在任何时候都有可能改变,恕不事先通知。

摘要

微软下一代Windows操作系统——代号“Longhorn”,不仅在操作系统如何工作,而且在应用程序生成方式上都有显著的改变。“Longhorn”版本 的Windows包含一个新的存储系统,自然搜索技术和在安全与

高信度计算方面的增强。这里作者提供了对Longhorn的总体看法,重点讲述"一次生成多次部署"应用程序模型。另外,他论述代号“XAML“的新语言,此语言用于创建用户界面元素,随后他提供了一些例子。

有很多理由可以认为, 微软Windows®操作系统的下一次发布, 代号”Longhorn”,是一个真正的里程碑。它是第一个由受管代码生成的和第一个拥有彻底改变文件系统概念的存储子系统(代号“WinFS”)的操作系统。它也是第一个支持自然搜索技术(natural UI)的操作系统,此技术解决了在搜索文本时所存在的内在不确定问题。另外,Longhorn是第一个彻底地在核心层设计安全和可信计算的操作系统。这些和其他一些特性暗示Longhorn将改变应用程序的生成方式――这可不是每天都发生的事情。自Windows出现以来,我记得两个类似的里程碑, 一个是32位Windows的出现,另一个是微软.Net框架受控环境的出现。

Longhorn一个最重要的改变是操作系统使得一次编写应用程序,在多种部署场景中运行成为可能。为了达到这个野心勃勃的目标,基于Longhorn的应用程序完全是面向对象的和派生于一个中枢Application对象, 这个对象提供运行应用程序需要的所有关键服务。在这篇文章里,我将以一定深度检视Longhorn应用程序模型,并将其应用于几个基本场景,包括经典的“Hello World”程序。

Longhorn应用程序模型

Application对象是Longhorn应用程序模型的核心。通过它提供的一套属性、方法和事件,你能够组织多个标记页面(markup pages)——一种增强HTML版本的集合到一个连贯的和标准的基于Windows应用程序。Application对象是Longhorn中可用的根对象。它提供基本的应用程序支持,典型地被用于那些需要低资源消耗和不需要页面导航和状态管理功能的应用程序。更多的复杂Longhorn应用程序会使用很接近的NavigationApplication对象,它继承于Application并增加了对导航的支持。

一个典型的Longhorn应用程序可以被认为是一组通过某些程序码写成的页面集。Application对象控制程序的执行,发送事件给用户代码。页面用新公布的标记语言编写,代号“XAML”(可扩展应用程序标记语言)。通过XAML元素,你可以控制每个页面的布局,包括文本和图像的显示,交互组件如按钮和文本框的插入。概要地说,XAML是一种用于绘制页面用户界面的语言, 这些页面组成应用程序。除了使用XAML,你也能完全通过程序码(procedural code)来编写Longhorn应用程序。通常,成功的基于Longhorn应用程序有两个组成成分——XAML页面和受控程序码。如何联合他们取决于你,然而两者任意的组合都可接收。

通过使用XAML和C#(或Visual Basic®.Net)代码的组合,你能生成多种类型的输出文件,包括传统的Windows桌面可执行文件、Dll库和控制台程序。另外,如果你的应用程序足够简单,它可以通过使用独立的XAML标记页面来提供,因而产生可以加到上面输出文件列表中的 另一种类型应用程序。单独的XAML文件在Longhorn Shell和浏览器中是可执行的,只要他们不引用codebehind类。最后,值得一提的是,Windows可执行文件 在Windows(默认)和浏览器环境中都能执行。在两种情况下,代码保持一致,唯一需要的是用不同的工程设置再编译一次。

对于Longhorn,桌面可执行程序是现今Windows窗体客户边框(client-side)应用程序的下一个版本。另一方面,XAML和基于浏览器程序 表明了从现今客户边框编程模型到运行于Web的进化。此时,现有的客户边框程序很少部署在Web中。如果将一个Windows窗体嵌入到一个浏览器页面中,你会得到一个减少的程序特征集,而且必须在你的代码上作一些琐碎的改动。Longhorn中,普通的应用程序模型就可以让你编一个程序并将其部署到Web中。然而, 最后所说的这种应用程序是Longhorn特有的——相当不同于传统的像ASP.NET那样的Web程序。

Visual Studio®和.NET框架的下个版本,代号为“Whidbey”(或者称MSBuild.exe工具), 在编译程序时会产生一个.exe文件、一个程序清单(.manifest)和一个部署清单(.deploy)。如果点击.exe文件,应用程序会如期运行。如果配置成在浏览器中运行,一个IE实例会启动并成为应用程序的宿主(hosts the application)。作为可选择的,你也能从一个远程服务器部署程序。完成这个任务的步骤如下 。首先,拷贝部署清单文件到你服务器上的适当位置。它可以是一个FTP或HTTP路径。其次,拷贝.exe文件和程序清单到你服务器上适当位置。部署清单文件与.exe文件和程序清单文件的服务端路径不必一致。如果它们不同,则需要手工编辑部署清单,使它指向程序清单路径。清单文件是平常的XML文件。当用户将浏览器指向服务端具体的部署路径时,Longhorn在客户端自动下载并安装程序和清单,还创建一个指向.deploy文件的快捷方式。最后,用户点击.deploy文件来运行程序。

所有Longhorn程序都有共同的结构――带有内联或codebehind程序码的XAML页面和从Application派生的根对象。Application对象起控制器作用;它的生命期与程序的生命期一致。通过Application对象,你可以处理顶层事件和在多个页面间共享代码和状态。它也负责让用户依据程序逻辑浏览(Naviagate)多个页面。在典型的Longhorn程序中, 用户通过从一个页面导航到另一个来执行操作和使用应用程序功能。导航(Navigation)通常以新页面代替老页面方式完成。然而,也能够弹出新的窗口来显示新页面。 并不是所有Longhorn程序都需要导航;只包含一个页面的简单程序就不需要它。

正如前面所提,除了标记元素,XAML页面可以包含程序码。例如,处理一个页面上XAML元素触发的事件时,就需要程序码。程序码既能内联于XAML文件体中,也能放在一个codebehind文件中。

在Longhorn中编程是基于受管代码。但是,只有少数兼容.NET语言能用于编写基于XAML程序。现在,这些语言列表包括C#、Visual Basic .NET和Jscript®.NET。到Longhorn发布之时,其他的兼容.NET语言将被期待加入其中。只有当前三种语言的限制是基于下面的事实:XAML文件源码必须在处理器空闲时解析和编译, 因此,编译器和相关的代码文档对象模型必须预先可用。可是,注意,如果完全用程序码编写应用程序,你就能使用任意兼容.NET语言(当然,能获取关于此语言的有效编译器)。注意,只有基于XAML程序是限制于上面三种语言。如果程序码嵌入到XAML页面,则必须在运行前编译程序;如果在XAML页面中没有程序码,它就能直接通过双击来显示,如同HTML页面一样。Longhorn不会处理未编译的代码,它也没有在空闲时编译代码的能力。是不是等不及要看看Longhorn中类似“Hello World”程序?这里有一个最简单的XAML代码例子。

<Canvas

xmlns="http://schemas.microsoft.com/2003/xaml"

Background="LightCyan"

Width="100%" Height="100%"

<Image Source="lh.bmp" Canvas.Left="5" Canvas.Top="5" /

<Text Canvas.Left="90" Canvas.Top="20" FontSize="36"Hello, Longhorn!

</Text

</Canvas

Figure 1 简单XAML页面

以.XAML 扩展名保存这个小程序为文本文件,将 Longhorn 浏览器指向它,或者直接在Shell中双击它。Figure 1显示了运行结果。<Canvas>节点定义了程序用户界面区域——主要是绘图界面。背景属性指明区域的背景颜色,宽度和高度指明了区域的大小。<Image>和<Text>元素定义了页面的内容。两者都使用父对象 Canvas 的 Left 和 Top 属性来确定他们的绝对位置。

理解Longhorn应用程序

Longhorn提供了一组框架类,它们扩展并加强.NET框架1.1。从支持XAML到存储系统,从应用程序模型到可信计算和高级Web服务,这些方面都体现了Longhorn中存在的扩展。 Longhorn和Whidbey代表了微软路标中两个显著的里程碑。Whidbey计划在Longhorn之前几个月发布,所以当Longhorn发布时,Longhorn将包含能提供核心服务的Whidbey的升级版。

让我们看看所有Longhorn应用程序的共同基础——XAML语言。XAML是一个基于XML的语言,被设计来针对性地用于描述应用程序的用户界面。熟悉Win32®和.NET框架的程序员会发现XAML标签和传统的Windows控件有明显的相似。但是,XAML标签套件比Win32普通控件或Windows窗体控件更抽象、更广阔。为了立刻理解XAML代表什么和应该怎样看待它,想想ASP.NET页面。或者,更明确一些,想想一个只能找到服务端控件(runat=”server”)且没有文本的特殊ASP.NET页面。

每个XAML标签对应于一个.NET框架类和伴随一个方法、属性、事件的集合。你能够在XAML脚本中设置属性和挂接事件,也能够使用被打包在一个codebehind类的程序码。每个标签后的控件在运行时被实例化,并在屏幕上占有一块用于提供输入的区域。在最高抽象层面,此模型很多方面类似ASP.NET,只是被抽象以工作在一个通用的、更丰富的Windows平台。

XAML中每个元素使用一个内在类,但是很多类并没有对象XAML元素。有很多抽象类,它们大多用于继承。能在XAML中创建的任何事物都可以在程序码中创建。例如,用XAML创建一个按钮,你可以使用下列代码:

<Canvas xmlns="http://schemas.microsoft.com/2003/xaml"

<Button Canvas.Left="10"

Canvas.Top="10"

Width="90px"

Height="32px"Click Me</Button

</Canvas

在C#程序码中,可以创建同样的按钮,如下:

Button btn = new Button();

btn.Width = new Length(90);

btn.Height = new Length(32);

Canvas.SetTop(btn, new Length(10));

Canvas.SetLeft(btn, new Length(10));

btn.Content = "Click Me";

在XAML文件中,你不能使用方法,但是可以设置属性(Attributes)。属性通常对应properties,但是类的少数properties没有XAML属性。你能个别地设置类Properties或依赖风格(styles)。风格是风格属性的集合,编译器自动应用这些风格属性到使用风格的控件上。所有XAML页面至少有一个Panel元素,其负责担当容器窗口和控制子成员位置和全局属性,如背景颜色和字体。XAML页面元素以分层方式组织,它有一个单独的根元素。典型地,这是一个Panel的继承类,比如DockPanel或Canvas,或一个Decorator的继承类,比如Border。Canvas元素用于根据绝对坐标设置成员的位置。元素通常在唯一确定的区域被绘制;如果多个元素占用相同的坐标,它们出现在文件中的顺序决定它们被绘制的顺序。

除了属性和方法,XAML元素还可以提供许多事件。通过创建事件处理例程,你能够使页面动态响应它们的通知消息。Longhorn中,事件handler被创建和挂接到元素上的方式几乎与当今在.NET程序中的方式一样。事件

处理例程通过一个属性被声明, 它通过codebehind类与程序合成一体:

<Button Width="90px" Height="25px" Click="OnHandleClick"

Click Me

</Button

页面中的元素组成了程序树,它是一个包含所有程序运行时组件的对象模型,也是易于编程的。每个控件暴露访问孩子控件的 方法。主要模式是:panel.Children.Add(element), listbox.Items.Add(object), button.Content = object, and textbox.TextRange.Text = string.

支持孩子的控件也支持将专用对象(arbitrary object)作为孩子,如strings,elements,或其他完全自由对象(这个例子里称为ToString)。每个控件有一个父属性,以提供在树中对其父控件的访问。注意,通过访问树的各种属性,只有儿子才能被返回,而不是孙子或后代。 这种对象模型允许你操纵页面上元素的每个方面。它也提供不能通过XAML完成的其他能力。例如,动态创建元素,你也能基于运行条件在空闲时创建它们。

为使这些内容更清楚,我们看看第二个例子程序。正如早些提到过,任何严格意义上的Longhorn程序都包含程序码和XAML脚本。下面让我们看看如何超越最初的Hello World程序,增加对一些事件的处理。

Figure 2显示了一个新应用程序的全部源码, 在这个应用程序里XAML被绑定到一些存储于一个codebehind类的程序码中。如果比较XAML和ASP.NET Web窗体页面,除了语法你不会发现任何显著的不同。def:CodeBehind和def:Class属性封装C#代码的方式,非常类似于Visual Studio codebehind类封装ASP.NET代码的方式。让我们将Figure 2中XAML文件命名为events.xaml,将Figure 2中codebehind类命名为events.xml.cs。如果 用浏览器执行它,将会出现一个运行错误,如Figure 3所示。在我用的版本中,错误信息不是很明白,但是错误的原因很清楚。它跟这个XAML文件不能动态被编译有关。不像ASP.NET,Longhorn需要你明确地编译通过XAML脚本嵌人或简单引用 的程序码。今后,这个特征可能有很大的改变,但是眼下它强制你在Visual Studio中组织一个Longhorn工程,或作为选择,熟悉MSBuild,其可执行文件名是msbuild.exe。Longhorn解决方案和工程文件有与Visual Studio2003相同的扩展名和结构。一个Longhorn工程文件看起来像Figure 4中所列的代码。

Figure 3 XAML Error

工程文件包含了工程相关的重要信息。标签指明编译器必须生成的包类型。工程属性和项目被组织在和嵌套标签内。每个元素的命名都是可读的。工程文件通过命令行传递给msbuild.exe工具。MSBuild位于框架文件夹Windows\Micorsoft.NET。下列简单的命令会生成基于Events.Proj工程文件的可执行文件:

msbuild.exe Events.proj

除非你想练习MSBuild工具,否则不应该过多关注它。正如前面所提,Visual Studio 的Whidbey版本与Longhorn SDK很好地集成在一起,编译Longhorn程序时只需点击普通工具条上按钮或者按F5键。Figure 5显示了Figure 2代码的运行结果。在应用程序树层次里,只有一个蓝色面板是可见并显示有文字。程序树层次比观察Figure 5得到的表面印象要稍稍复杂。树根节点是一个包含DockPanel对象的 窗体。DockPanel是所有用户界面元素的最外层容器,并包含一个孩子FlowPanel,这个孩子节点相应也包含一个Text对象。文本通过Text类的实例 绘制。你应该注意到XAML标签有几个属性可以控制它们的外观。更重要的是,它们支持ID属性,而ID属性提供了运行时识别。无论何时你在控件区域内点击,关联 FlowPanel 类的 MouseLeftButtonDown 事件就被触发。当点击后,OnLeftMouseDown 事件

处理程序代码被调用。可以看到,流动面板(flow panel)的宽度和高度放大一倍,文字也改变了。再点击,又恢复到原大小。

Figure 5 运行程序

尽管谁也无法阻止你编写纯程序码的程序,但是,使用XAML文件,你能较容易描述并模板化程序的用户界面。

XAML语言

四种主要元素类别组成XAML词汇表——面板(panel)、交互控件(interactive control)、文档关联元素(document-related element)和图形(graphic shape)。边框元素(border element)也很重要,尽管它不属于上面任何一类。技术上看,它是一个“装饰品”,以提供细布局细节,其仅容纳一个子元素,但增加了视图效果。XAML中,面板处理页面布局,并担当其他元素的容器。面板管理被包含元素的绘制如大小和位置,排列它们的内容。Longhorn中一共有6个内置的面板类,但是开发人员可以通过定制面板行为来创建自己的面板。这些预定义的面板类是Canvas、DockPanel、FlowPanel、GridPanel、Table和TextPanel。Figure 6简单描述了它们。

Canvas是这些面板中唯一支持显示设置元素位置的面板。其所有孩子元素的描述都开始于一个固定的位置,然后紧接着大小。如果两个元素重叠,则最后一个绘制的元素获胜,它覆盖其他元素区域。注意描述时所用的坐标都是相对于Canvas,即,(0,0)表示面板 区域的最左上象素。下面是一个canvas对象例子。

<Canvas xmlns="http://schemas.microsoft.com/2003/xaml"

Height="600" Width="800"

<Border Background="red"

Canvas.Top="0px" Canvas.Left="0px"

Height="100px" Width="100px" /

<Border Background="green "

Canvas.Top="100px" Canvas.Left="100px"

Height="100px" Width="100px" /

<Border Background="blue"

Canvas.Top="50px" Canvas.Left="50px"

Height="100px" Width="100px" /

</Canvas

同样是包容其他元素,DockPanel则有不一样的行为。这种面板所有孩子相互之间都是水平或垂直地浮动。既然如此,它们的位置只是相对于上一个控件,并不需要坐标。DockPanel适合于创建一个按钮条,如同工具条那样。这里有一个例子:

<Border xmlns="http://schemas.microsoft.com/2003/xaml"

Background="black"

<DockPanel

<Button DockPanel.Dock="Left" Width="50px" Height="32px"

Open

</Button

<Button DockPanel.Dock="Left" Width="50px" Height="32px"

Save

</Button

<Button DockPanel.Dock="Left" Width="50px" Height="32px"

Print

</Button

</DockPanel

</Border

第一个按钮被放置在面板的左侧,其他按钮都与紧邻的按钮水平对齐(见Figure 7)。

Figure 7 按钮布局

FlowPanel允许孩子元素在可用空间内以任何方式流动。这种面板包含了处理显示内容超过面板宽度的逻辑。既然 如此,则依照这个对象的配置,超出的内容会换行显示或被裁减掉。下面的XAML例子示范了FlowPanel如何将逻辑上是一单行的内容截断并换行。四个square元素被一个大一些的元素包容。小square的宽度之和大于容器 元素的宽。因为所有小square不适合于放在一行中,所以此行被截断,最后一个square移到下一行。注意默认的面板流向是从左到右,从顶端到底端:

<FlowPanel xmlns="http://schemas.microsoft.com/2003/xaml"

Width="250px" Height="250px"

<Border Background="red" Width="75px" Height="75px" /

<Border Background="green" Width="75px" Height="75px" /

<Border Background="blue" Width="75px" Height="75px" /

<Border Background="orange" Width="75px" Height="75px" /

</FlowPanel

GuidPanel是一个轻量级元素,用于布置具有格子风格的对象和生成简单的表格。GridPanel允许你将任意控件安置在一个矩阵似的行和列中,但是总体上 只具备一个有限的特征集。更复杂的表格可以通过Table面板生成,它们具有很多高级功能。Table面板的结构由多行组成。你能为页头或页脚定义一组行,也能插入不同设置的行。这种面板的布局能力可以让你创建相当复杂的 数据显示表格。

最后,当需要复杂的文本布局支持时,TextPanel是理想的选择。然而,对于基本的文本支持,Text元素将是更好的选择,因为它消耗更少资源(和更少的能力)。

MSAvalon.Windows.Controls名字空间将所有负责用户交互的控件组合起来。例子中属于这个名字空间的类,如Button、ListBox和CheckBox,都是老熟人,一些新的如ContextMenu、PageViewer和RadioButtonList也属于这个名字空间。用户交互元素的基类是Control,它提供一组公共的属性和方法。

Figure 8 页面查看器

特别地,PageViewer控件提供用于查看在线文档的用户界面,封装了分页和页面导航功能。下面的例子生成一个页面查看器,其占据整个客户区。页面查看器分页显示了PageViewer标签Source属性指定文件的文本:

<DockPanel ID="root" xmlns="http://

schemas.microsoft.com/2003/xaml"

xmlns:def="Definition"

<Text DockPanel.Dock="Top"See a

PageViewer control in action below.

</Text

<PageViewer DockPanel.Dock="Top"

Source="Sample.xaml" Height="80%" Width="80%"/

<Button DockPanel.Dock="Top" Width="50%"OK</Button

</DockPanel

有趣的是,通过PageViewer控件显示的源文件不能是纯文本、RTF或HTML文件。至少目前,它必须是一个包含普通ASCII文本的XAML文件,这些文本通过支持分页的Avalon控件包装起来。Avalon是Longhorn中新的显示子系统(presentation subsystem)的代号(请看本期Charles Petzold的文章)。例如,看看TextPanel类:

<TextPanel ID="root" xmlns="http://schemas.microsoft.com/2003/xaml"

text to show goes here

</TextPanel

保存这段代码片段到文件sample.xaml中,以运行早先的例子。记住xmlns名字空间是必须的。

MSAvalon.Windows.Documents名字空间中的类负责文档显示。总的看来,这些类就像是高级HTML标签的超集。你能看到一些如Block、Column、Heading和Footer类,也有CloumnGroup、RowGroup、HyperLink、List,还有更多。

在我所用的Longhorn预发布版本中,前面看到的Text类属于System.Windows.Controls名字空间。Text类支持多行和多种格式,包括粗体和斜体,字体大小和嵌套的孩子元素。在只需要简单文本场合中,Text是首选类,因为它是轻量级的并具备多种可用特色。

Longhorn显示模型通过使用XAML面板元素来绘制图像。面板提供许多大小和对齐属性,也可以控制边框、背景色和填充。

Longhorn中,图像是通过Windows Vector Graphics绘制出来。Windows Vector Graphics提供许多比GDI和GDI+更多好处,它是基于XML的图像标记系统,易于使用和重用。如果你是Scalable Vector Graphics的拥护者,你也会喜欢它。Windows Vector Graphics提供如椭圆、线、路径、多边形、PolyLine和矩形这些预定义图形,这些都从Shape类继承。这些元素从Shape继承了许多公共的属性,包括Stroke、StrokeThickness、Fill,外加其他 用于指定坐标和顶点的属性。这些图形能够被倾斜、旋转、平移、缩放。正如你能够指定图形的填充色和背景,你也能指定色彩灰度。下面例子设置了矩形填充属性为水平灰度,以红色开始以蓝色结尾。

<Rectangle xmlns="http://schemas.microsoft.com/2003/xaml"

Canvas.Top="10" Canvas.Left="10"

Fill="HorizontalGradient Red Blue"

RectangleLeft="0" RectangleTop="0"

Width="50" Height="50"/

生成简单应用程序

通过使用XAML语言,你能快速有效构造一个用户界面原型。我敢打赌:到Longhorn发布后,大量的开发工具会升级(或从开始就内置)以完全支持XAML“所见即所得”(WYSIWYG)属性。Longhorn预览版本已经包含一些Visual Studio .NET Whidbey版本的扩展。下面让我们看一个严格的、可交互的程序。你会很快发现同编写一个Windows窗体程序没有多大的不同,也会惊喜的发现现有的.NET技巧多么适用于Longhorn。Figure 9中,你可以看到一个只包含文本框和上下文菜单的简单程序。文本框在XAML文件中定义,上下文菜单在空闲时创建。完整代码见Figure 10

Figure 9 上下文菜单

Longhorn中,所有程序都需要实例化Application类。这个对象是Longhorn应用程序模型的核心。然而,Application对象仅提供基本 的程序支持,典型被用于需要低资源消耗和不用导航功能的程序。实际使用中,更多的Longhorn程序采用相近的NavigationApplication对象,它继承于Application并增加对导航的支持。

NavigationApplication对象支持许多方法、属性和事件,通过它们可以组合多个XAML页面到一个单个程序中。某种意义上,基于简单Application类的Longhorn程序相当于Win32中基于对话框程序。同样,可以将支持导航的程序比作“完全 的Win32程序”,许多窗体 构成了这种Win32程序的整个功能。下列代码显示使用导航的例子。

myApp = NavigationApplication.Current;

win = (Navigation.NavigationWindow) myApp.Windows[0];

...

private void Button_Back(Object sender, ClickEventArgs e)

{

// If possible, go to the previous window

if(win.CanGoBack())

win.GoBack();

}

通过Application(或NavigationApplication)静态Current属性,可以得到application对象的引用。前面的例子显示如何获取栈中第一个窗体的引用。Button_Back事件处理函数检查前一个窗体对象是否存在,如果存在,则以类似浏览器方式转回原窗体。

下一个例子描述如何通过继承并覆盖OnStartingUp方式,定制一个具备导航能力程序的启动行为。下列代码段覆盖OnStartingUp,以实现当程序启动时创建并显示一个导航窗体的功能。

public class MyApp : NavigationApplication

{

NavigationWindow win;

...

protected override void OnStartingUp(StartingUpCancelEventArgs e)

{

win = new NavigationWindow();

// Add elements to the window

...

navWin.Show();

}

...

} 让我们回到Figure 9显示的例子程序。按照已论述过的知识,你应该要么选择Application要么选择NavigationApplication作为基类,因为程序打算使用单窗体,即“基于对话框”程序。命名为“Sample1”的工作类覆盖OnStartingUp方法并定义一些事件处理函数。必须覆盖OnStartingUp方法,因为它体现程序的初始化步骤,因此是在打开窗体前执行你自己代码的理想位置。

OnStartingUp中完成的操作是创建窗口,窗口内容是用XAML文件和codebehind类描述。XAML页面本身由控件或其他存在于层次树中的组件组成。决定页面如何绘制和表现行为的是:这些不同组件或称元素之间的关系。Figure 9中例子页面有一个给定大小和字体的文本框(TextBox)控件。文本框与事件ContextMenuEvent绑定。只要用户右键点击控件的客户区,事件就被触发。

事件handler创建一个ContextMenu对象(见Figure 10)。安置上下文菜单,设置图形属性,然后将它与父对象关联, 此父对象是一个文本框。值得注意的是,通过选择背景和背景色、边框和字体,Longhorn让你很容易定制菜单(也包括其他所有对象)的外观。不要被这样的事实愚弄:在Windows以前的版本做同样的事也很容易,当然包括.NET框架。Win32中,这种类型的定制需要许多编程工作,它决不简单。.NET框架中,封装类隐藏许多必须的代码到框架包中,仅暴露少数属性给用户。另一方面,在Longhorn中,控件的用户界面就像它看起来一样简单。

上下文菜单的元素通过MenuItem类创建。将它们与事件handler绑定 方式基本上与基于框架程序一样:

mia = new MenuItem[3];

for (int i=0; i

当某一个菜单项被点击时,事件handler开始执行,并使用传入的第一个参数获取源对象的引用:

public void LowerCase(Object sender, ClickEventArgs args)

{

MenuItem mi = (MenuItem) args.Source;

ContextMenu menu = (ContextMenu) mi.Parent;

TextBox thisTextBox = (TextBox) menu.PlacementTarget;

thisTextBox.Text = thisTextBox.Text.ToLower();

}

为了获取TextBox,必须沿着对象树上溯。首先,得到MenuItem,然后ContextMenu,最后就可以获取ContextMenu的拥有者,即TextBox。这时,修改TextBox的内容是很直接的。

结束语

Longhorn标志着Windows操作系统历史上的里程碑。它是第一个明确地基于受管代码设计的Windows版本。Longhorn更重要的特性在于新的程序模型;特别的是,在以前基于.NET框架和ASP.NET程序模型经验基础上,Longhorn的设计和实现达到了新的顶峰。

Longhorn程序全部由Application对象生成,能使你将多个标记页面组成一个连贯的程序。隐身于Longhorn程序后XAML语言的出现也是一个抽象水平的象征, 围绕它Longhorn程序模型才被设计出。Longhorn最终目标是让你一次编写程序,在不同场景多次部署它们,包括Web和基于客户机环境。

介绍一个只有少数人试验过的新平台的应用程序模型不是一份容易的任务。它甚至比你考虑将来哪些方面可能会显著改变更困难。依照这些内容,应该把这篇文章看作目前Longhorn一个快照和简单一瞥。

我已经将例子工程源码作成下载包,以便于你在Longhorn运行。你能通过在本文顶部的连接得到改工程源码。

原作者简介:

Dino Esposit 是一位讲师和顾问,他生活在意大利的罗马。他是Programming ASP.NET(Microsoft

Press)一书的作者。他目前大部分时间用于教授关于ADO.NET和ASP.NET课程和参加会议并演说。

Dino的联系方式:cutting@microsoft.com

本文由 VCKBASE MTT 翻译

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航