引子http://www.cnblogs.com/KENNETHBYRON/articles/584787.html


  正如WPF/E项目经理Joe Stegman说的那样,WPF/E是WPF Everywhere.那么究竟WPF/E是什么呢?它又是如何工作的呢?让我们现在就看看它.
    这有几个WPF/E的页面效果演示,如果无法正常显示,请下载并安装WPF/E客户端运行库(1.1M)

  演示地址:
Page Turner
Sprawl Game
Film Strip Slide-Show
Media Library
Simple Video Playback

概要:

  1. WPF/E开发背景及开发目标
  2. WPF/E的实质和前景
  3. WPF/E的实现原理及工作机制基础
  4. WPF/E参考资源

1.WPF/E开发背景及开发目标

    随着.NET框架3.0的正式发布,Windows Presentation Foundation(WPF)即Windows表现层基础,Windows Communication Foundation(WCF)即Windows通信层基础和Windows Workflow Foundation(WWF)即Windows工作流基础,三大基础成为开发组织方式新的实现,为开发分工协作提供了更好的模型和支持,并大幅度的完善了微软.NET类库.WPF作为表现层基础开发库,提供了对DirectX更好的支持,优化了2D和3D表现层引擎,与WinForm开发紧密结合,实现了传统的Win32和WinForm对XAML(拓展应用程序标记语言)程序的支持和装载功能.然而WPF却未能实现ASP.NET WebForm装载XAML程序,而且在非3.0运行库支持平台上WPF无法正常工作.
    出于WPF的局限性,WPF/E应需而生,WPF/E对Web应用开发ASP.NET 2.0作出拓展,实现
  • 更轻松,更自由的网络应用程序开发
  • 提高网络应用程序对媒体文件的表现效果和支持性
  • 应用最新的标准
  • 采用友好的AJAX和XAML表现
    当然.WPF/E并非仅仅定义在网络应用上,它的跨平台性,可拓展性及优越的兼容性势必使WPF/E在实际应用上得到更多层面的拓展.

2.WPF/E的前景和实质

    WPF/E是对图形界面,动画效果,媒体文件及XAML程序支持性的拓展,相信大家对WPF的展示效果也有所了解,在VISTA下,WPF将界面效果展示得淋漓尽致,玻璃,半透明,圆角,多边不规则图形,倒影等等.当然WPF的展示效果还不仅于此,WPF的动画效果也令人叹为观止,倒映,水波纹,滚动,浮动等等.试想下,如果我们将这些效果应用在网页上,那么动画页面便不再仅仅是FLASH的天地了.
    说了这么多.WPF/E到底是什么呢?
    WPF/E实际是通过JavaScript在普通的HTML页面上,将一个XAML程序以对象的方式呈现.
    而仅仅是呈现么?
    当然不是,在呈现之后.NET Framework会讲传统的HTML DOM树与XAML程序生成的XAML DOM树结合.这样我们可通过JavaScript同时将两个DOM树联系起来,形成HTML,ASP.NET和XAML的交互.这样整个Web应用程序形成了一个可以相互通信的有机体系.
    同时,WPF/E仅仅是小型的客户端运行库,所以它可以轻松实现跨平台安装,并且对媒体文件的支持非常好,其内建的WMV,WMA,MP3解码器摆脱了以往需要安装Windows Media Player才可以播放Windows媒体文件的烦恼.
    WPF/E将于明年被集成到ASP.NET,.NET FxCL及CLR Managed Code中.

3.WPF/E的实现原理及工作机制基础

    首先来看一下下面这幅简单的WPF/E页面结构图

WPF/E解读系列(一)


    如上图,在一个普通的HTML文档中,WPF/E通过object或embed对象元素,以ActiveX控件的形式,将XAML程序的一个实例插入页面中,参数以object或embed的param属性传入XAML程序.然后WPF/E建立XAML DOM树,通过HTML DOM树和XAML DOM树,我们可以轻松的取得页面中任何对象的ID属性,并可以随意在JavaScript中引用其对象.
    现在我们来模拟一下上面的过程.

    1.建立XAML元素并指定ID

1WPF/E解读系列(一)<script type="text/xaml" id="agControlXaml">
2WPF/E解读系列(一)    <Canvas    xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
4WPF/E解读系列(一)                       xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml >
5WPF/E解读系列(一)        <Rectangle x:Name="myRect" Fill="Orange" Width="100" Height="100" Canvas.Top="10" Canvas.Left="10"/>
6WPF/E解读系列(一)    </Canvas>
7WPF/E解读系列(一)</script>
    
    2.在HTML页面中插入一个DIV做为XAML程序的容器

1WPF/E解读系列(一)<div class="agHost" id="agControlHost">
2WPF/E解读系列(一)</div>

    3.在页面中插入一个object/embed元素.用来承载ActiveX控件.并由该ActiveX控件负责调用XAML程序

1WPF/E解读系列(一)<object id="AgCtrl1" height="312px" width="354px" codebase="xcpctrl.cab#version=0,0,3,0"
2WPF/E解读系列(一)              classid="CLSID:32C73088-76AE-40F7-AC40-81F62CB2C1DA">
3WPF/E解读系列(一)    <param name="SourceElement" value="agControlXaml" />
4WPF/E解读系列(一)    <param name="BackgroundColor" value="White" />
5WPF/E解读系列(一)</object>

    这样就可以生成一个简单的WPF/E页面了.完整代码如下: 

IE6+
 1WPF/E解读系列(一)<html xmlns="http://www.w3.org/1999/xhtml">
 2WPF/E解读系列(一)<head>
 3WPF/E解读系列(一)</head>
 4WPF/E解读系列(一)<body>
 5>

FF

 1WPF/E解读系列(一)<html xmlns="http://www.w3.org/1999/xhtml">
 2WPF/E解读系列(一)<head>
 3WPF/E解读系列(一)</head>
 4WPF/E解读系列(一)<body>
 5>

    效果:
            WPF/E解读系列(一)            WPF/E解读系列(一)

    随着CTP的发布,通常该加载过程会被封装在一个JavaScript方法中, 当页面被加载时,浏览器通过object的classid属性或embed的pluginspage来找到特定类型的ActiveX控件,创建控件实例,并指定该ActiveX控件的ID,由该ActiveX控件寻找param中name为SourceElement的script XAML元素,或param中name为Source的XAML程序地址参数,ActiveX控件在容器元素中创建XAML程序的一个实例.

    具体如下:
    调用方法:

 1WPF/E解读系列(一)new agHost("wpfeControl1Host",// 容器元素ID
 2WPF/E解读系列(一)                                                            //(用来放置WPF/E ActiveX控件的HTML元素常用<div>)
 3WPF/E解读系列(一)                      "wpfobj",                    // 我们创建的WPF/E ActiveX控件的ID
 4WPF/E解读系列(一)                      "900",                          // 宽度
 5WPF/E解读系列(一)                      "710",                          // 高度
 6WPF/E解读系列(一)                      "#ffB42600",              // 背景色
 7                          null,                             // SourceElement (Scrpt标记名,包含XAML)
 8WPF/E解读系列(一)                      "mainPage.xaml",      // Source XAML源文件地址
 9WPF/E解读系列(一)                      "false",                          // 是否无窗口
10WPF/E解读系列(一)                     "24",                              // 最大祯率
11WPF/E解读系列(一)                      null);                             // OnError事件 (方法名--无括号)

    封装的源代码(aghost.js):

  1WPF/E解读系列(一)  var hosts  = new Object();
  2  

    通过封装,简化了页面调用XAML的过程,使得页面代码更加清晰,分离了设计和实现代码.所以,我们看到的WPF/E页面的源代码通常是下面这样的: 

 1WPF/E解读系列(一)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 2WPF/E解读系列(一)<HTML><HEAD><TITLE>"WPF/E" CTP(December 2006<TITLE>
 3WPF/E解读系列(一)<script type="text/javascript" src="js/aghost.js
 4WPF/E解读系列(一)</HEAD>
 5WPF/E解读系列(一)<BODY>
 6>

    同时WPF/E支持事件模型,该模型通过JavaScript实现.事件的声明在XAML元素中.当声明某事件时,预定义的事件以属性的方式写在XAML元素的属性集中,并将一个JavaScript函数作为事件处理方法赋值给事件.

1WPF/E解读系列(一)<Canvas xmlns="http://schemas.microsoft.com/client/2007"
2WPF/E解读系列(一)                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3WPF/E解读系列(一)                Loaded="javascript:onLoaded" >
4WPF/E解读系列(一)    <TextBlock x:Name="myTextBlock" />
5WPF/E解读系列(一)</Canvas>

    当事件被触发时,窗体会自动调用JavaScript函数

1}

    CTP中的预定义时间包括如下几个:

    下面是几个简单的事件:

 1WPF/E解读系列(一)/* XAML */
 2WPF/E解读系列(一)<Canvas
 3WPF/E解读系列(一)                   xmlns="http://schemas.microsoft.com/client/2007"
 4WPF/E解读系列(一)                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 5WPF/E解读系列(一)    <Ellipse x:Name="e1" MouseMove="javascript:e1Move"
 6WPF/E解读系列(一)                   MouseEnter="javascript:e1Enter" MouseLeave="javascript:e1Leave"
 7WPF/E解读系列(一)                   MouseLeftButtonDown="javascript:e1Down" MouseLeftButtonUp="javascript:e1Up"
 8WPF/E解读系列(一)                   Height="100" Width="100" Canvas.Left="80" Canvas.Top="30"
 9WPF/E解读系列(一)                  Stroke="Black" StrokeThickness="2" Fill="LightBlue"/>
10   </Canvas>
11WPF/E解读系列(一)

 1}

    从程序员的角度来说,如何取得HTML及XAML文件中的对象是很关键的.HTML DOM树和XAML DOM树可以使我们方便的取得页面中的任何一个对象.

WPF/E解读系列(一)

    上图显示了一个WPF/E页面的DOM结构.当XAML文件被加载到页面时.我们可以获取标准的DOM树取得XAML对象的ID.
    通过JavaScript取得XAML中对象实例引用的具体实现方法如下:

 1WPF/E解读系列(一)<script type="text/javascript">
 2WPF/E解读系列(一)    // 先创建一个WPF/E ActiveX控件.
 3WPF/E解读系列(一)    new agHost("agControl1Host"//HostElementID
 4WPF/E解读系列(一)                           "ag6",                       // WPF/E ActiveX control ID
 5WPF/E解读系列(一)                           "300px",                   // Width
 6WPF/E解读系列(一)                           "300px",                   // Height
 7WPF/E解读系列(一)                           "#D6D6D6",           // BackgroundColor
 8WPF/E解读系列(一)                           null,                         // SourceElementID
 9WPF/E解读系列(一)                           "myxaml.xaml",     //The XAML uri
10WPF/E解读系列(一)                           "false",                    // IsWindowless
11WPF/E解读系列(一)                           "30",                        // MaxFrameRate
12WPF/E解读系列(一)                           null                          // OnError handler. 
13WPF/E解读系列(一)                           );
14WPF/E解读系列(一)</script>

    通过下面的JavaScript.我们可以取得XAML对象

1WPF/E解读系列(一)var ag6 = document.getElementById("ag6");

    接下来.试一下取得XAML内的子对象

WPF/E解读系列(一)WPF/E解读系列(一)


    想取得XAML内的子对象需要用到XAML元素的FindName(“strName”)方法,如:

 1

    同样,我们也可以动态的通过JavaScript在XAML中创建子对象,具体方法如下:

1WPF/E解读系列(一)/* XAML */
2WPF/E解读系列(一)<Canvas Width="300" Height="300"
3WPF/E解读系列(一)                 xmlns="http://schemas.microsoft.com/client/2007"
4WPF/E解读系列(一)                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5WPF/E解读系列(一)                 Background="Transparent"
6WPF/E解读系列(一)                 MouseLeftButtonDown="javascript:createEllipse">
7WPF/E解读系列(一)    <TextBlock Text="click for circle"? FontSize="40"/>
8WPF/E解读系列(一)</Canvas>
9WPF/E解读系列(一)

1}

4.WPF/E参考资源

SDK文档
http://msdn2.microsoft.com/en-us/library/bb188266.aspx

Channel9对WPF/E项目经理的采访视频
http://channel9.msdn.com/showpost.aspx?postid=263358

WPF/E开发中心
http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx

开发工具

VS2005 Express
http://msdn.microsoft.com/vstudio/express/
Expression
http://www.microsoft.com/products/expression/en/default.mspx

PS:   系列内容简介

  • Chapter I The history background, aim, nature and mechnism basic of WPF/E
  • Chapter II Focusd on XAML and animation presetation of WPF/E
  • Chapter III Hosting a XAML App in a HTML page
  • Chapter IV Encapsulated Java Script in WPF/E
  • Chapter V Understanding work behind pages
  • Chapter VI Develop and implemented WPF/E projects on VS2005
  • Chapter VII Demo projects and Questions review
  • 相关文章: