之前的博客我介绍过如何做一个动画,以及渐变风格动画,关键帧动画。我们如果仅仅使用这些知识做一个模拟现实的动画,仍然是比较复杂的,比如:我们要实现一个篮球掉下再弹起,再掉下,再弹起的动画。或者我们要实现一个类似钟摆的动画效果,它需要我们去研究物理学,数学的知识,Silverlight 3 内置了11中Animation Easing,它可以让我们更容易的实现一些常见的动画效果。
这内置的11种Animation Easing 动画效果是:
- 倒退缓冲(BackEase):让动画在继续之前往后退一点。这有点象在斜坡上启动汽车,会往后倒退一点然后才前进。
- 弹跳缓冲(BounceEase):有弹回效果的动画,类似我们前面提到的篮球落下,弹起,再落下,即弹跳反冲。
- 圆缓冲(CircleEase):创建使用循环函数加速和/或减速的动画。 基于三角函数(圆函数)来加速动画,一开始的加速度比较慢,越往后加速度越快。
- 立方体缓冲(CubicEase):创建使用公式
加速和/或减速的动画。 与圆缓冲类似,但是是基于立方体函数的时间来产生一个一开始加速度较慢然后越来越快的动画。 - 伸缩缓冲(ElasticEase):创建表示弹簧在停止前来回振荡的动画。类似于弹跳缓冲(BounceEase),它会让一个值摆动直到停下为止。
- 指数缓冲(ExponentialEase):创建使用指数公式加速和/或减速的动画。类似于圆缓冲和立方体缓冲,只是加速度的值是按照指数来变化的。
- 乘方缓冲(PowerEase):创建使用公式
(其中,p 等于 PowerEase.Power 属性)加速和/或减速的动画。这是一种指数缓冲,缓冲的值与时间的乘方成比例。 - 平方缓冲(QuadraticEase):创建使用公式
加速和/或减速的动画。非常类似于CubicEase,除了在这个缓冲中,值是基于时间的平方。 - 四次方缓冲(QuarticEase):创建使用公式
加速和/或减速的动画。类似于Cubic和Quadratic,只是值是基于时间的立方。 - 五次方缓冲(QuinticEase):创建使用公式
加速和/或减速的动画。类似于Cubic、Quadratic和Quartic,值基于时间的五次方。 - 正弦缓冲(SineEase):创建使用正弦公式加速和/或减速的动画。沿着正弦波来对值进行加速。
另外 Animation Easing 还有一个缓动模式,它是下面三个枚举之一,用于决定Animation Easing 的行为方式,参看:
http://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.easingmode(VS.95).aspx:
- EasingMode.EaseIn:内插遵循与缓动函数相关联的算术公式。
- EasingMode.EaseOut(默认值):内插遵循 100% 内插减去与缓动函数相关联的公式输出。
- EasingMode.EaseInOut:内插将 EaseIn 用于动画的前半部分,将 EaseOut 用于动画的后半部分。
下面是一个经典的演示这11中动画效果的例子,例子来自: http://www.shinedraw.com/animation-effect/11-storyboard-animation-easing-demonstration/ 那里也有这个例子的源码下载:
在下面,点击每种动画对应的图标,根据选择的动画类型,持续时间就会演示这个动画。
参考资料:
译文:Silverlight 3.0 新功能之二 : 动画缓冲(Animation Easing)
http://www.cnblogs.com/arthur008/archive/2009/05/21/1466417.html
稳扎稳打Silverlight(37) - 3.0动画之Easing(缓动效果)
http://www.cnblogs.com/webabcd/archive/2009/08/20/1550334.html
Silverlight动画概述
http://msdn.microsoft.com/zh-cn/library/cc189019(VS.95).aspx
微软官方网站Animation Easing的例子
http://samples.msdn.microsoft.com/Silverlight/silverlight_next/Animations/easing_functions_gallery/testpage.html
Silverlight 3's New Animation Easing
http://www.wintellect.com/CS/blogs/jprosise/archive/2009/03/26/silverlight-3-s-new-animation-easing.aspx
Easing in Silverlight and WPF
http://www.kirupa.com/blend_silverlight/easing_sl_wpf_pg1.htm
Silverlight 3.0: Easing Functions
http://www.silverlightplayground.org/post/2009/03/18/Silverlight3-Easing-Functions.aspx
Silverlight 3 Quick Tip #3: Creating custom easing for Silverlight animations
http://blogs.microsoft.co.il/blogs/alex_golesh/archive/2009/03/19/silverlight-3-quick-tip-3-creating-custom-easing-for-silverlight-animations.aspx
Easing animations in Expression Blend
http://simplesilverlight.wordpress.com/2008/03/18/easing-animations-in-blend/
11 Storyboard Animation Easing Demonstration
http://www.shinedraw.com/animation-effect/11-storyboard-animation-easing-demonstration/
Easing Function In Blend 3 In Silverlight 3
http://www.c-sharpcorner.com/UploadFile/dpatra/EasingFunctionInBlend307102009134910PM/EasingFunctionInBlend3.aspx
下面是一些搜索引擎优化的基础知识:
影响搜索引擎排名的主要因素:
内部因素:
跟关键字有关的内部因素:
- URL中出现关键字;
- 网页Title中出现关键字;
- 常规内容中出现关键字;
- 在页面的第一段中出现关键字;
- 在页面的最后一段中出现关键字;
- 在Heading 标签中出现关键字,比如: H1,H2等标签;
- 站内的链接中出现关键字;
- 导向相关内容的导出链接出现关键字;
- 导出链接中出现关键字;
- 图片文件名中出现关键字;
- alt 标签中出现关键字;
- 注释中出现关键字;
- 关键字进行适当的装饰(加粗、斜体等)
其他内部因素:
外部因素:
- 大量的导入链接;
- 从高PR值得网页获得导入链接;
- 从相关内容网站获得导入链接;
- 导入链接指向的网页有具体内容;
- 锚文字中有关键词;
- 锚文字周围有相关词;
- 锚文字存在于文章或句子中;
- 导入链接的时间长度,一般导入链接的存在时间有3-6个月;
- 单向链接的价值高于交换链接;
- 导入链接的页面的导出链接小于100个,流出链接越少越好;
- 链接来自不同IP;
- 合理的导入链接增长频率;
要完全避免的做法:
- 关键词堆积;
- 所有的锚文字都相同;
- 使用CSS或背景色隐藏内容,这是十恶不赦的大恶;
- 使用JavaScript跳转;
- 相同ip之下的网页直接进行大量交换链接;
- 桥页和Cloaking,诱导搜索引擎的爬虫,这是十恶不赦的大恶 ; 参看: http://baike.baidu.com/view/1979085.htm
- 成人内容,违禁药品,赌博相关内容;
- 内容重复;
- 连向作弊的网站;
- 站内的绝大部分网页有相同的网页title;
- 加入到Link Farm或则Link交换类网站;
- 使用被惩罚过的域名;
- 网站建立在被惩罚的IP上;
- SEO做的过于明显;
- 大量网页标题重复或相似
要尽量避免的做法:
- 地址中存在动态变量;
- 单一图片和Flash的网站;
- 用Javascript、Flash、Silverlight制作的网站导航条或目录;
- 用图片做网站导航而不加ALT标签;
- 〈head〉〈/head〉之间有太多的代码;
- 存在太多与网站主题无关的内容;
- 导入链接中购买链接占多数;
- 和作弊的网站在同一服务器上;
- 搜索有一批重大恶疾的黑名单,躲开这些网站;
- 内容页较多采用论坛列表方式,标题直接链接到论坛帖子。
参看百度百科的描述: http://baike.baidu.com/view/7147.htm
需要注意的是:SEO不是几句话或一个方案就完事了,而是一个非常系统的工程。对于任何一次策划和方案,都需要前期大量的工作。这至少应该包括下面项:
- 竞争对手分析;
- 网站结构分析;
- 关键词定位;
- 链接检查;
- SPAM清除;
下面这篇是一个有点意思的网站结构分析文档:
http://www.admin5.com/article/20070309/36970.shtml
上面提到的一些名词解释
PageRank:
PageRank ,也简称 PR, 简单来说就是Google标识网页重要性等级的一个数值。它的具体算法比较复杂,而且Google一般一年更换四次PR的算法。
网上有简化的,根据外链的数量和质量来计算PageRank的算法存在,比如下面这篇文章描述的算法:http://community.mybbchina.net/thread-141.html
虽然我们不能知道具体算法,但是影响Google PageRank的主要因素确是可以知道的,如下:
- 与pr高的网站做链接:
- 与内容质量高的网站链接
- 加入搜索引擎分类目录
- 加入免费开源目录
- 你的链接出现在流量大、知名度高、频繁更新的重要网站上
- Google对PDF格式的文件比较看重。
- 安装Google工具条
- 域名和tilte标题出现关键词与meta标签等
- 反向连接数量和反向连接的等级
- Google抓取您网站的页面数量
- 导出链接数量
参看百度百科的描述:http://baike.baidu.com/view/260976.htm
MIX 2010 大会上发布了 Silverlight 4 RC。 以前因为 VS2010 RC 暂时不支持 Silverlight 4,一直没有装VS2010 RC。 现在终于可以装了。
下面就是安装的一些注意事项:
首先当然是卸载之前的版本,包括下面罗列的这些卸载项,卸载一定要卸载干净才好安装:
Microsoft Expression Blend Preview for .NET 4
Microsoft Expression Blend SDK Preview for .NET 4
Mircosoft Expression Blend 3 SDK
Microsoft Silverlight 4 Tools for Visual Studio 2010 Beta 2
Microsoft Silverlight 4 Beta SDK
Mircosoft Silverlight
Mircosoft Silverlight 3 SDK
WCF RIA Services Preview for Visual Studio 2010 (这个要优先删除,否则一旦.NET Framework 4删除后,这个就没法卸载了)
Microsoft Visual Studio 2010 Ultimate Beta 2 - ENU
Microsoft .NET Framework 4 Extended Beta2
Microsoft .NET Framework 4 Client Profile Beta2
Microsoft .NET Framework 4 Multi-Targeting Pack
Microsoft .NET Services SDK(March 2009 CTP)
Microsoft ASP.NET MVC 2
Microsoft ASP.NET MVC 2 - Visual Studio 2010 Tools
Microsoft Help 3.0 Beta2
Microsoft SQL Server Compact 3.5 SP2 Beta English
Microsoft Sync Framework Runtime v1.0 SP1 Beta(x86)
Microsoft Sync Framework SDK v1.0 SP1 Beta
Microsoft Sync Framework Service v1.0 SP1 beta(x86)
Microsoft Sync Service for ADO.NET v2.0 SP1 Beta(x86)
Microsoft Team Foundation Server 2010 Beta 2 Object Model - ENU
Microsoft Visual C++ 2010 Beta 2 x86 Runtime - 10.0.21006
Microsoft Visual F# Runtime 1.0
Microsoft Visual Studio 2010 ADO.NET Entity Framework Tool Beta 2
Visual Studio 2010 Beta 2 Tools for SQL Server Compact ENU
Visual Studio 2010 Tools for Office Runtime Beta 2 (x86)
Windows Azure Tools for Microsoft Visual Studio 2010 1.0 (11/2009) Beta 2
VS2010 RC 版的安装:
下载并安装 Microsoft Visual Studio 2010
http://www.microsoft.com/downloads/details.aspx?FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a&displaylang=en
下载并安装3个VS2010 RC的补丁
这部分信息可以参看下面两篇Scott的博客
http://blog.joycode.com/scottgu/archive/2010/02/16/115889.joy
http://blog.joycode.com/scottgu/archive/2010/03/14/115909.joy
KB980610 (VS 2010 RC版Intellisense崩溃问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=26662&wa=wsignin1.0
KB980920 (修补了工具提示调用和停留于标识符之上时崩溃问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=27019
KB981167(修补了Web Forms设计器不能向自动生成的设计器文件中正确添加控件问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=27117&wa=wsignin1.0
Silverlight 4 Tools for VS2010RC
下载并安装Silverlight 4 Tools for Visual Studio 2010(March 2010版)
该Tools会同时安装Silverlight Developer runtime、 SDK、 tools、 和 WCF RIA Services
Silverlight 4 Tools for Visual Studio 2010
这部分信息可以参看: http://www.silverlight.net/getstarted/silverlight-4/
Blend 4
下载并安装 Expression Blend™ 4 Beta。 这个版本才是上面版本Silverlight4可用的。
http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&displaylang=en
一些你可能用到的支持 Silverlight 4 RC 的Toolkit
WCF RIA Services Toolkit March 2010
http://www.microsoft.com/downloads/details.aspx?FamilyID=7b43bab5-a8ff-40ed-9c84-11abb9cda559&displaylang=en
Silverlight Toolkit
http://silverlight.codeplex.com/
Silverlight 4 RC 的改进
Ensuring That Your Silverlight Applications Work with Silverlight 4
http://msdn.microsoft.com/en-us/library/cc645049(VS.96).aspx
Silverlight 4 RC 相对于 Beta 2 的变化
http://www.cnblogs.com/024hi/archive/2010/03/16/1686828.html
搜索引擎优化对任何面向公众的网站来说都非常重要,ASP.net 4.0 为此就做了大量改造。这些改进包括如下:
301永久性重定向
随着时间的迁移,网站的一些页面地址会发生变化,这会导致搜索引擎收录的链接地址、用户收藏的地址失效。Response.Redirect() 就是解决这个问题的。但是Response.Redirect 有以下问题:
Response.Redirect()方法产生的是个 HTTP 302 跳转,在用户尝试访问老的URL时,会导致多余的HTTP往返。另外搜索引擎一般不会跟随多个跳转,这意味着使用一个临时转向会负面影响你的网页排名。
我之前写过博客,介绍如何实现301跳转,“从HTTP状态 301,302,200 来看页面跳转” 那时候实现 301 跳转比较麻烦,ASP.net 4.0 为此专门增加了Response.RedirectPermanent() 方法用来解决这个问题。
简单来说,如下表所示:
| HTTP状态 | 解释 | 程序代码 |
| 301 | 301 代表永久性转移(Permanently Moved) 即永久性重定向 | Response.RedirectPermanent("test_2.aspx"); |
| 302 | 302 代表暂时性转移(Temporarily Moved ) | Response.Redirect("test_2.aspx"); |
MVC 中也有类似的代码:Response.RedirectToRoute(string routeName) 和 Response.RedirectToRoutePermanent(string routeName)
Head 中的 keywords 和 description
由于搜索引擎优化作弊的原因,现在搜索引擎正在淡化这两个关键字的参考作用。比如这篇博客:“Keywords和Description--SEO高手为什么不用” 就描述了原因。但是如果可以,建议还是设置这两个关键字,ASP.net 4.0 中为方便设置这两个关键字专门做了优化,我们可以通过下面简单几行代码就可以完成动态设置:
protected void Page_Load(object sender, EventArgs e)
{
Page.Title = "测试标题";
Page.MetaKeywords = "测试关键字";
Page.MetaDescription = "测试简介";
}
或者在ASPX 文件中如下写:
<%@ Page Language="C#"
Title="测试标题"
MetaKeywords = "这是我的,关键字"
MetaDescription = "这是一个简介"
AutoEventWireup="true"
CodeBehind="Test_2.aspx.cs"
Inherits="WebApplication_CacheOutput.Test_2"
%>
Scott那个例子估计是更早测试版本的,那时候是 Keywords , Description ,而不是 MetaKeywords 和 MetaDescription。
ASP.NET Web Forms也支持了URL导向
简洁、直观的URL,搜索引擎喜欢,用户也喜欢。在ASP.NET 4.0中,URL Routing既可以映射到ASP.NET MVC控制器类,也可映射到基于ASP.NET Web Forms的网页。
你甚至可以在一个项目中,混合使用含有 Web Forms 和 MVC控制器,即:使用单一一套导向规则在它们之间映射URL。
下面是一个简单的例子:
Global.asax 中注册路由规则:
void RegisterRouters(System.Web.Routing.RouteCollection routes)
{
routes.MapPageRoute(
"my-Test-Route", // 路由名称--随便自己爱好起了
"p/{key}", // 路由规则
"~/WebForm1.aspx" // 该路由规则交给哪一个页面来处理
);
// ...... 当然,你可以继续增加更多的自己的路由规则
}
void Application_Start(object sender, EventArgs e)
{
RegisterRouters(System.Web.Routing.RouteTable.Routes);
}
测试接受请求的页面代码,为了进行测试,我们这里接受所有参数,并显示出来,方便理解:
protected void Page_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("this.Page.RouteData.Values");
sb.AppendLine("<br />");
foreach (var item in this.Page.RouteData.Values)
{
sb.AppendFormat("{0}={1}<br />\r\n", item.Key, item.Value);
}
sb.AppendLine("this.Page.Request.QueryString");
sb.AppendLine("<br />");
foreach (var item in this.Page.Request.QueryString)
{
sb.AppendFormat("{0}={1}<br />\r\n", item, this.Page.Request.QueryString[item.ToString()]);
}
sb.AppendLine("this.Page.Request.Form");
sb.AppendLine("<br />");
foreach (var item in this.Page.Request.Form)
{
sb.AppendFormat("{0}={1}<br />\r\n", item, this.Page.Request.Form[item.ToString()]);
}
Response.Write(sb.ToString());
}
完成上述代码,我们就可以通过不同URL的请求测试了。
比如我们访问 http://localhost:3215/p/abc?s=1 ,测试的结果就是:
this.Page.RouteData.Values
key=abc
this.Page.Request.QueryString
s=1
this.Page.Request.Form
参考资料:
VS 2010 和 .NET 4.0 系列之《ASP.NET 4 中的SEO改进 》篇
http://blog.joycode.com/scottgu/archive/2010/01/06/115842.joy
.NET 4的新特性:图表、SEO及可扩展的输出缓存
http://www.infoq.com/cn/news/2010/02/.NET-4-Charts-SEO-Cache
Asp.Net4.0/VS2010新变化(4):SEO的改进
http://www.cnblogs.com/yjmyzz/archive/2010/03/05/1679235.html
Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由
http://www.cnblogs.com/yjmyzz/archive/2010/03/05/1679140.html
09年的QCon大会给我的感觉是国内技术大会中技术含量最高的,收获相当丰厚。2010年的QCon大会仍然是非常期待的。
我感兴趣的关键字主要是:架构,RIA,网站案例分析,实战经验。我对这些感兴趣的原因如下:
- 学习架构可以让自己整体把握能力增强,技术人员在一定年份后,深入学习架构是一个几乎无法逃避的路。
- 看别人的网站案例分析,实战经验,可以在其中时不时听到一个小技巧,一个小技巧就可以让自己少走很多弯路,这些技巧可不是通过课本的学习可以学到的,需要有足够的经验积累才能知道,现在有机会让你不用自己去摔跟头知道它,何乐而不为呢?
- 关注RIA(我关注的主要是 Silverlight,因为我有C#的基础,比起Flash,更容易让我入门,而且这种经验也可以用在WPF中)是因为RIA的出现,可以让我做很多以前不敢想象的事情,RIA会带动用户体验的很大的一步进步。
在2010年的QCon大会的日程中我可以看到下面感兴趣的课程:
信息的特征:
- 客观性:信息是客观事物在人脑的反映。而反映的对象则有主观和客观的区别,因而,信息可以分为主观信息和客观信息。主观信息,如决策、指令、计划等;客观信息,如国际形势,经济发展等信息。
- 普遍性:物质的普遍性决定了信息的普遍存在,因而信息是无所不在的。
- 无限性:客观世界是无限的,反映客观世界的信息自然也是无限的。
- 动态性:信息随着时间的变化而变化,因而是动态的。
- 依附性:信息是客观世界的反映,因而要依附于一定的载体而存在,需要有物质的承担者。信息不能完全脱离物质而独立存在。
- 变换性:信息通过处理可以实现变换或转换,使其形式和内容发生变化,以适应特定的需求 。
- 传递性:信息在时间上的传递就是存储,在空间上的传递就是转移或扩展。
- 层次性:客观世界是分层次的,反映它的信息也是分层次的。
- 系统性:信息可以表示为一种集合,不同类别的信息可以形成不同的整体。因而,可以形成与现实世界相对应的信息系统。
- 转换性:信息的产生不能没有物质,信息的传递不能没有能量,但有效地使用信息可以把信息转化为物质或能量。
Silverlight 3 开始支持 WriteableBitmap。WriteableBitmap 是一个可写入并可更新的 BitmapSource。BitmapSource 是 WPF/Silverlight 图像处理管线的基本构造块,从概念上说表示具有特定大小和分辨率的单个不变的像素集。
他们类的继承层次结构如下:
System.Object
System.Windows.Threading.DispatcherObject
System.Windows.DependencyObject
System.Windows.Freezable
System.Windows.Media.Animation.Animatable
System.Windows.Media.ImageSource
System.Windows.Media.Imaging.BitmapSource
System.Windows.Media.Imaging.BitmapFrame
System.Windows.Media.Imaging.BitmapImage
System.Windows.Media.Imaging.CachedBitmap
System.Windows.Media.Imaging.ColorConvertedBitmap
System.Windows.Media.Imaging.CroppedBitmap
System.Windows.Media.Imaging.FormatConvertedBitmap
System.Windows.Media.Imaging.RenderTargetBitmap
System.Windows.Media.Imaging.TransformedBitmap
System.Windows.Media.Imaging.WriteableBitmap
System.Windows.Interop.InteropBitmap
需要注意的,上面的结构是WPF中支持的,Silverlight 3仅支持上面红色的那两个,其他的不支持。
MSDN 网站描述这个类的用途如下:
使用 WriteableBitmap 类一帧一帧地更新和呈现位图。这对于拍摄视频播放快照、生成算法内容(如分形图像)和数据可视化(如音乐可视化应用程序)很有用。
WriteableBitmap主要有两种使用方法:
- 使用WriteableBitmap构造函数呈现位图
- 使用WriteableBitmap类的Render 方法呈现位图,可以多次调用Render 方法,继而实现图片的合并,游戏的换肤就可以用这种方式。
使用类的构造函数呈现位图
下面我就来演示一个最简单的使用 WriteableBitmap 类的构造函数演示位图的例子,这个例子截文本输入框中的图到右边列表框中。
Xaml 文件:
<UserControl x:Class="Silverlight_WriteableBitmap.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical" >
<TextBox x:Name="tb_Txt" Width="200" Height="150" AcceptsReturn="True" TextWrapping="Wrap" Text="测试测试"/>
<Button x:Name="btn_printScreen" Width="100" Height="39" Content="截屏" Margin="50" Click="btn_printScreen_Click" />
</StackPanel>
<ListBox x:Name="listBox" Width="200" />
</StackPanel>
</UserControl>
C#代码文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
namespace Silverlight_WriteableBitmap
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void btn_printScreen_Click(object sender, RoutedEventArgs e)
{
WriteableBitmap bitmap = new WriteableBitmap(tb_Txt, null);
Image img = new Image();
img.Height = 150;
img.Width = 150;
img.Source = bitmap;
img.Stretch = Stretch.Uniform;
ListBoxItem item = new ListBoxItem();
item.Content = img;
listBox.Items.Add(item);
}
}
}
说明:
上面例子中,我们使用的是 public WriteableBitmap(UIElement element, Transform transform) 这个构造函数。element 是要在位图中呈现的元素;transform 是用户在绘制到位图之前最后一步应用到元素的变换。如果您希望位图将元素的变换考虑在内,则这对于您特别有意义。此值可为 null。
这个 WriteableBitmap 构造函数适用于绝大多数的"复制内容"方案。这个构造函数可生成在保留内容基础下,尽量减少空白的 PBGRA32格式(采用32BPP的一种基于sRGB的像素格式)的 WriteableBitmap。它把 element 的各种变化都考虑进去了,这些变化包括:Clip,Effect,Opacity,OpacityMask,Children。当然还有一些变化没有包含,这时候,我们可以对他的父控件进行截屏,就可以扑捉到这些没有包括的变化。另外:WriteableBitmap 不能呈现弹出式控件,如 Popup、ComboBox 和 ToolTip。
使用Render多次呈现位图
另外, 如果您希望多次呈现此位图,则使用 Render 方法。如果您使用 Render 方法,则需要调用 Invalidate 以便呈现位图。 当向位图中的像素分配颜色时,请使用自左乘的颜色。
多次呈现的一个典型场景就是游戏的换肤,比如这篇博客就探讨到这个问题:Silverlight游戏中的WriteableBitmap技术可行性报告
下面的例子则是演示通过多次Render呈现,实现字体的立体效果。
演示XAML代码
<UserControl x:Class="Silverlight_WriteableBitmap.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">
<Grid x:Name="LayoutRoot" Background="DarkGray">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border BorderBrush="Red" BorderThickness="2"
Grid.Row="0">
<Image x:Name="OutputImage1"/>
</Border>
<Border BorderBrush="Blue" BorderThickness="2"
Grid.Row="1">
<Image x:Name="OutputImage2"/>
</Border>
<Border BorderBrush="Green" BorderThickness="2"
Grid.Row="2">
<Image x:Name="OutputImage3"/>
</Border>
</Grid>
</UserControl>
C#代码部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Media.Imaging;
namespace Silverlight_WriteableBitmap
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private WriteableBitmap SetupRenderedTextBitmap(string text, double fontSize)
{
// setup the textblock we will render to a bitmap
TextBlock txt1 = new TextBlock();
txt1.Text = text;
txt1.FontSize = fontSize; // set the font size before using the Actual Width / Height
// create our first bitmap we will render to
WriteableBitmap bitmap = new WriteableBitmap((int)txt1.ActualWidth,
(int)txt1.ActualHeight);
txt1.Foreground = new SolidColorBrush(Colors.Black);
bitmap.Render(txt1, new TranslateTransform() { X = -2, Y = -2 });
txt1.Foreground = new SolidColorBrush(Colors.White);
bitmap.Render(txt1, new TranslateTransform());
// invalidate the bitmap so that it is rendered
bitmap.Invalidate();
return bitmap;
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
WriteableBitmap bitmap1 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/", 64.0D);
WriteableBitmap bitmap2 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/", 24.0D);
WriteableBitmap bitmap3 = SetupRenderedTextBitmap("http://blog.joycode.com/ghj/", 12.0D);
OutputImage1.Source = bitmap1;
OutputImage2.Source = bitmap2;
OutputImage3.Source = bitmap3;
}
}
}
演示效果如下图:
说明:
- Render 方法支持不属于可视化树的 UIElement 对象。您需要先为不在可视化树中的 UIElement 对象调用 Measure 和 Arrange,然后再调用 Render。
- 调用Render 方法之后,必须调用 Invalidate 以便呈现此位图。
- 如果元素比位图大,或者如果元素在自己空间的负区域中具有一些点,则会根据情况对它进行剪裁。
参考资料:
silverlight3新增功能2:WriteableBitmap
http://www.cnblogs.com/dino623/archive/2009/09/04/silverlight.html
用于 Silverlight 的 .NET Framework 类库 : WriteableBitmap 类
http://msdn.microsoft.com/zh-cn/library/system.windows.media.imaging.writeablebitmap(VS.95).aspx
用于 Silverlight 的 .NET Framework 类库WriteableBitmap 构造函数 (UIElement, Transform)
http://msdn.microsoft.com/zh-cn/library/dd638675(VS.95).aspx
Silverlight游戏中的WriteableBitmap技术可行性报告
http://www.cnblogs.com/Jax/archive/2010/02/02/1662287.html
Rendering Text to a WriteableBitmap with Silverlight 3's Bitmap API
http://www.smartypantscoding.com/content/rendering-text-writeablebitmap-silverlight-3s-bitmap-api
电子政务:是指政府机构在其管理和服务职能中运用现代信息技术,实现政府组织结构和工作流程的重组优化,超越时间、空间和部门分隔的制约,建成一个精简、高效、廉洁、公平的政府运作模式。
电子政务模型,或者叫模式,或者叫内容,可简单概括为两方面:
- 政府部门内部利用先进的网络信息技术实现办公自动化、管理信息化、决策科学化;
- 政府部门与社会各界用户(企业和公众)利用网络信息平台充分进行信息共享与服务、加强群众监督、提高办事效率及促进政务公开等等。
从政府工作形式看,分为四个方面,也体现电子政务的四个发展阶段:
- 公文电子化;
- 内部办公自动化,建立政府部门内部办公自动化系统,应用计算机辅助行文、汇报、报表及管理业务,达到业务流程化;
- 行政管理网络化,实现在线信息交互和网上交互式办公;
- 部门间协同工作,以业务(项目)为中心,多个政府机构利用网络平台协同工作。
从政府与用户交互的角度,电子政务模式也分四种形式,包括:
- 网上信息发布,用户可以从网上获取法规、办事程序条例等政务信息;
- 网上信息单向流动,用户可以下载表格等;
- 网上双向互动,实现信息交互,网上登记、信息咨询、上传表格、政府采购、招标、报税等;
- 在线事务处理,涉及多个部门的业务借助网络完成处理,网上政府审批、证照办理等。
从电子政务的服务对象来看,电子政务主要包括几个方面:
- 政府内电子政务(G2G);
- 政府对企业电子政务(G2B);
- 政府对公民电子政务(G2C)。
G2G是上下级政府、不同地方政府、不同政府部门之间的电子政务。
它的主要目的是:指打破机关组织部门的垄断和封锁,加速政府内信息的流转和处理,克服政府各部门相互推诿、扯皮现象,提高政府内部的行政效率。
政府内电子政务主要包括以下内容:
- 电子法规政策系统;
- 电子公文系统;
- 电子司法档案系统;
- 电子财政管理系统;
- 电子资料库;
- 电子办公系统;
- 电子邮递;
- 电子培训系统;
G2B是政府通过网络系统进行电子采购与招标,精简监管、管理业务流程,提高办事效率,迅速地为企业提供便捷的各种信息服务,减轻企业负担,促进企业发展。
政府的电子采购与招标有利于体现公平公正的原则和防止腐败,大大节约政府部门的运行成本。
政府对企业的管理服务以及监督的网络化,有利于营造公平的竞争环境,减少暗箱操作以及权钱交易,通过获取政府公开的各种信息资源,企业也可避免发展的盲目性,比较容易地找到更多的商机。
G2B主要包括以下内容:
- 电子采购与招标;
- 电子税务;
- 电子证照办理;
- 信息咨询服务;
- 中小企业电子服务;
可见,电子政务不仅为电子商务提供基础支撑和环境保障,而且通过G to B模式的电子政务,为电子商务提供业务的需求,实现电子政务与电子商务的互动推进。
G2C是电子政务的重要内容,是通过电子网络系统为公民提供各种服务。
通过G2C将提高政府政务活动的透明性,有利于公民的民主参与和有效监督,促使公务员的廉洁自律。
其主要内容包括:
- 教育培训服务;
- 就业服务;
- 电子医疗服务;
- 社会保险网络服务;
- 公民信息服务;
- 交通管理服务;
- 电子证件服务;
可见,电子政务是实现电子社区的前提和基础。
发挥信息系统效益的关键是信息系统的有机共享,电子政务也一样,电子政务信息资源共建共享的顺利实现,必须建立强有力的保障机制。这些机制包括:
- 组织保障机制;
- 法律政策保障机制;
- 经济保障机制;
- 技术保障机制;
- 人才保障机制;
- 安全保障机制;
组织保障机制:
它是一种通过建立相关的组织管理机构实施人为干预与调节来增进电子政务信息资源共建共享的行政机制。完全有必要成立一个电子政务信息资源建设的服务机构,负责实施电子政务信息资源的共建与共享,统筹兼顾,统一规划,从全局出发,重点规划设计政府部门协同工作的内容和流程,打破信息资源“部门割据”、“条块分割”的局面,解决政务信息资源为各个部门所有、各个部门垄断的问题,真正实现电子政务信息资源的共建与共享。
法律政策保障机制:
近年来,我国政府制定并颁布了一系列有关电子政务建设的法规政策,如《国家信息化领导小组关于我国电子政务指导意见》、《电子政务工程技术指南》、《电子政务信息共享互联互通平台总体框架技术指南(试行)》、《国家信息化领导小组关于加强信息处理安全保障工作的意见》、《全国政府系统政务信息化建设2001-2005年规划纲要》等。政府部门还需要加快制定一系列有关电子政务信息资源共建共享的方案、制度、规定、条例等,明确各相关主体的责任、权利和义务,为电子政务信息资源共建共享提供一个良好的法律政策环境。
经济保障机制:
经济保障机制应是按照“谁投资谁受益”原则建立的协调电子政务信息资源共建共享供需双方利益的市场机制。电子政务信息资源共建共享的实现离不开足够的资金投入,政府是实施电子政务的主体,各级政府要成为资金投入的主体力量,要为电子政务信息资源的共建共享提供足够的资金投入,各级政府要将电子政务信息资源共建共享所需经费纳入本级政府的财政预算,对于涉及多个部门的信息共享互联互通工程建设,资金应统筹安排,公共部分的建设要设立专项经费予以保障。而共建共享所需资金仅仅依靠政府的财政投入远远不够,还应在充分发挥中央和地方政府财政投入主导作用的同时,制定相应政策,充分调动高等院校、科研院所、中介机构、行业协会、企业等各方面的积极性,鼓励和引导社会资金参与电子政务信息资源共建共享系统工程建设、管理和运营,电子政务信息资源共建共享工程的建设和管理需要积极探索市场化运行模式,逐步向企业化、市场化运行方向转化。在资金投入过程中,要切实加强资金管理,完善资金管理制度和资金使用的绩效考评制度,提高资金使用的规范性和有效性。
技术保障机制:
- 构建信息共享互联互通平台
- 全面推行标准化
- 加强共享数据库建设
构建信息共享互联互通平台:
根据《电子政务信息共享互联互通平台总体框架技术指南(试行)》的要求,信息共享互联互通平台应由下面5个基本系统组成:
- 流程管理系统;
- 应用集成系统;
- 应用适配器系统;
- 管理和监控系统;
- 安全支撑系统;
其中,流程管理系统、应用集成系统、应用适配器系统是平台的核心。
信息共享互联互通平台采用“三横两纵”的总体框架结构。
“三横”为流程层的流程管理系统,应用层的应用集成系统,数据层的应用适配器系统。
“两纵”为支撑“三横”的管理和监控系统及安全支撑系统。
“三横两纵”以“三横”为主体,重点解决信息共享互联互通中数据交换、应用集成、流程协同三个层次的问题。
“两纵”是“三横”实现安全的、可管理的、可监控的信息共享互联互通环境的支撑。
全面推行标准化:
标准化是实现电子政务信息资源共建共享的先决条件,无论是网络统一平台还是资源共享,都需要标准。我国电子政务统一标准的出台速度跟不上电子政务建设步伐。目前,我国电子政务相关标准很多。仅我国已经颁布的国家级标准就达800多个,此外还有各式各样的行业标准。但是如此众多的标准缺乏统一性,标准过多、过泛给政府部门和相关厂商带来了很多不便,甚至形成了大量的信息孤岛。对众多标准加以统一和规范,是解决标准滞后与过多、过泛的惟一途径。因此,要加强标准化建设的管理工作,统一网络和信息的标准规范,统一标准是互联互通、信息共享、业务协同的基础。
加强共享数据库建设:
目前,我国信息资源开发和共享相对滞后的矛盾十分突出,在信息化建设中出现了“有路无车”和“有车无货”等现象,许多数据库更新不及时,甚至是“死库”,一些电子政务关键业务不能实现互联互通和互操作。从而造成了许多信息基础设施和技术设备得不到充分利用,制约了电子政务功能的发挥。因此,必须改变目前建库力量分散,低水平重复建设的局面。按照整合、共享、完善、提高的要求,建立电子政务信息共享数据库,有效调控增量资源,激活存量资源,最大限度发挥现有资源的潜能。
人才保障机制
软件的使用人才的素质提高,才是提高整体效益的最根本所在。据国家行政学院的一项调查,大约有20%的公务员对计算机操作几乎处于空白的状态,这说明在推进政府信息化的过程中,提高公务员的整体素质,特别是计算机应用方面的能力,将是一项艰巨的任务。
安全保障机制
影响电子政务信息安全的因素有很多,如网上黑客入侵和犯罪、网上病毒泛滥和蔓延,信息间谍的潜入和窃密,网络恐怖集团的攻击和破坏,内部人员的违规和违法操作,网络系统的脆弱和瘫痪,信息安全产品的失控等。因此,保障电子政务信息资源共建与共享,首先要保障共建与共享信息的安全,信息安全是电子政务信息资源共建与共享中最关键、最根本的问题。
参考资料:
http://www.ittang.com/2009/0527/9320_2.html
如何共建电子政务信息资源共享机制?
http://www.dianliang.com/hr/cio/zhengwu/200607/hr_127110.html
Path的Data数据有下面几种生成方式:
- 来自其它矢量图。比如使用 Expression Design,就可以直接粘贴来自其它软件的矢量图形,然后选择导出,导出时做如后选择:文件->导出->导出属性->格式->XAML Silverlight 画布,即可得到XAML格式的矢量图形,也就是Path。
- 使用转换路径,比如,我们要把文字转成图形,相当于印刷行业里的文字转曲,可以直接用 Expression Blend。选中对象->路径->转换为路径,即可。
- 自己动手写。当然这也是最难的方式。不过对于简单图形来说非常有用。用Design生成的数据量很大,手写就会变得很简洁。这篇博客就是要介绍Path命令的格式,以及如何写一些简单的Path。
首先是Path命令列表
下面这个地址有详细描述,Silverlight路径标记语法,我下面用表格的方式给出,更直观点。
说明:
- 下面命令中,语法部分显示的是单个空格,实际上使用单个空格的地方也可以使用多个空格;
- 命令前后的空格也不是必须的;
- 如果结果字符串比较明确,则无需使用逗号或空白将两个数字隔开。例如,2..3 解释为两个数字:"2."和".3"。同样,2-3 包含两个数字:"2"和"-3"。
- 下面的命令中,绝大多数大写表示绝对值,小写表示相对于前一点的值。
| 类型 | 命令格式 | 解释 |
| 移动指令 Move Command(M) | M x,y 或 m x,y | 比如:M 100,240 或 m 100,240 大写的 M 指示 x,y 是绝对值; 小写的 m 指示 x,y 是相对于上一个点的偏移量,如果是 (0,0),则表示不存在偏移。 当您在 move 命令之后列出多个点时,即使您指定的是线条命令,也将绘制出连接这些点的线。 |
绘制指令 (Draw Command) 通过使用一个大写或小写字母输入各命令: 其中大写字母表示绝对值, 小写字母表示相对值。 线段的控制点是相对于上一线段的终点而言的。 依次输入多个同一类型的命令时,可以省略重复的命令项; 例如,L 100,200 300,400 等同于 L 100,200 L 300,400。 | 直线:Line(L) | 格式: L 结束点坐标 或: l 结束点坐标。
| 比如:L 100,100 或 l 100 100。 坐标值可以使用x,y(中间用英文逗号隔开)或x y(中间用半角空格隔开)的形式。 |
| 水平直线: Horizontal line(H) | 格式: H x值 或 h x值 (x为System.Double类型的值)
| 绘制从当前点到指定x坐标的直线。 比如:H 100或h 100,也可以是:H 100.00或h 100.00等形式。 |
| 垂直直线: Vertical line(V) | V y值 或 v y值 (y为System.Double类型的值) | 绘制从当前点到指定y坐标的直线。 比如:V 100或y 100,也可以是:V 100.00或v 100.00等形式。 |
| 三次方程式贝塞尔曲线: Cubic Bezier curve(C) | C 第一控制点 第二控制点 结束点 或 c 第一控制点 第二控制点 结束点 | 通过指定两个控制点来绘制由当前点到指定结束点间的三次方程贝塞尔曲线。 比如:C 100,200 200,400 300,200 或 c 100,200 200,400 300,200 其中,点(100,200)为第一控制点,点(200,400)为第二控制点,点(300,200)为结束点。 |
| 二次方程式贝塞尔曲线: Quadratic Bezier curve(Q) | Q 控制点 结束点 或 q 控制点 结束点
| 通过指定的一个控制点来绘制由当前点到指定结束点间的二次方程贝塞尔曲线。 比如:q 100,200 300,200。其中,点(100,200)为控制点,点(300,200)为结束点。 |
| 平滑三次方程式贝塞尔曲线: Smooth cubic Bezier curve(S) | S 控制点 结束点 或 s 控制点 结束点
| 通过一个指定点来“平滑地”控制当前点到指定点的贝塞尔曲线。 比如:S 100,200 200,300 |
| 平滑二次方程式贝塞尔曲线: smooth quadratic Bezier curve(T) | T 控制点 结束点 或 t 控制点 结束点
| 与平滑三次方程贝塞尔曲线类似。在当前点与指定的终点之间创建一条二次贝塞尔曲线。控制点假定为前一个命令的控制点相对于当前点的反射。如果前一个命令不存在,或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令,则此控制点就是当前点。 比如:T 100,200 200,300 |
| 椭圆圆弧: elliptical Arc(A) | A 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点 或: a 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点
| 在当前点与指定结束点间绘制圆弧。 - 尺寸(Size): System.Windows.Size类型,指定椭圆圆弧X,Y方向上的半径值。
- 旋转角度(rotationAngle):System.Double类型。
- 圆弧旋转角度值(rotationAngle):椭圆弧的旋转角度值。
- 优势弧的标记(isLargeArcFlag):是否为优势弧,如果弧的角度大于等于180度,则设为1,否则为0。
- 正负角度标记(sweepDirectionFlag):当正角方向绘制时设为1,否则为0。
- 结束点(endPoint):System.Windows.Point类型。
比如:A 5,5 0 0 1 10,10 |
关闭指令 (close Command): 可选的关闭命令 | 用Z或z表示 | 用以将图形的首、尾点用直线连接,以形成一个封闭的区域。 |
填充规则(fillRule) 如果省略此命令,则路径使用默认行为:即 EvenOdd。 如果指定此命令,则必须将其置于最前面。> | EvenOdd 填充规则 | F0 指定 EvenOdd 填充规则。 | EvenOdd 确定一个点是否位于填充区域内的规则方法:从该点沿任意方向画一条无限长的射线,然后计算该射线在给定形状中因交叉而形成的路径段数。如果该数为奇数,则点在内部;如果为偶数,则点在外部。 |
| Nonzero 填充规则 | F1 指定 Nonzero 填充规则。 | Nonzero 确定一个点是否位于路径填充区域内的规则方法:从该点沿任意方向画一条无限长的射线,然后检查形状段与该射线的交点。从 0 开始计数,每当线段从左向右穿过该射线时加 1,而每当路径段从右向左穿过该射线时减 1。计算交点的数目后,如果结果为 0,则说明该点位于路径外部。否则,它位于路径内部。 |
一些简单例子:
Xaml 文件
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication_Test.MainPage"
Width="640" Height="500">
<Canvas Background="Black">
<!-- 1 //-->
<Path Stroke="BlanchedAlmond" Data="M101,95 L269,95"/>
<!-- 2 //-->
<Path Stroke="Blue" Data="m101,95 l269,95"/>
<!-- 3 //-->
<Path Stroke="BlanchedAlmond" Data="M101,95 58,54 60,38"/>
<!-- 4 //-->
<Path Stroke="BurlyWood" Data="M30,185 H100"/>
<!-- 5 //-->
<Path Stroke="BurlyWood" Data="M30,185 v100"/>
</Canvas>
</UserControl>
执行效果,下面数字分别标识了上面代码注释中的5条线。
Xaml 文件
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication_Test.MainPage"
Width="640" Height="500">
<Canvas Background="Black">
<!-- 1 //-->
<Path Stroke="AliceBlue" Data="M 150,50 c 80,3 8,60 120,30" />
<!-- 2 //-->
<Path Stroke="Aqua" Data="M 70,150 Q 80,30 120,90" />
<!-- 3 //-->
<Path Stroke="Azure" Data="M 90,150 s 118,3 190,90" />
<!-- 4 //-->
<Path Stroke="RosyBrown" Data="M 350,110 t10,20 32,10" />
<!-- 5 //-->
<Path Stroke="Red" Data="M 90,180 a 2 3 8 1 0 29,90" />
</Canvas>
</UserControl>
执行效果,下面数字分别标识了上面代码注释中的5条线。
Xaml 文件
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication_Test.MainPage"
Width="640" Height="500">
<Canvas Background="Black">
<!-- 1 //-->
<Path Stroke="AliceBlue" Data="F0 M 150,50 c 5,30 8,60 120,30 z" />
<!-- 2 //-->
<Path Stroke="Red" Data="F1 M 95,180 a 2 3 8 1 0 29,90z" />
</Canvas>
</UserControl>
执行效果,
更复杂的,建议还是用前2种方法吧。
参考资料:
silverlight中path对象使用总结
http://www.cnblogs.com/daizhj/archive/2008/07/14/1242181.html
Silverlight里C#绘制Path的方法
http://mcs.szu.edu.cn/user/zouzhxi/Article_53515
SilverLight 关于Path的Data生成问题
http://www.thinkaspx.com/wordpress/silverlight-on-the-path-of-the-data-generation-problem.Thinkaspx
Silverlight学习笔记--绘制与着色(上)
http://blog.joycode.com/ghj/archive/2009/11/24/115786.joy
乱弹琴 Silverlight 2.0 (14) 几何图形(Geometry)(二)路径标记语法
http://www.cnblogs.com/zxjay/archive/2008/04/18/1200692.html
我们在Silverlight 项目中,新加一个文件,比如一个图片文件,这个文件的属性会有下面2个选项,这两个选项决定了这个图片资源如何存储,如何使用。
先说简单的,资源文件的 Copy to OutPut Directory 属性, 这个属性有如下三个选项:
他们都是在程序编译或者部署时,判断此资源文件是否要同步用的。
| Do not copy | 不做数据同步 |
| Copy always | 每次都会被同步过去 |
| Copy if newer | 当有新版本存在时,才会被同步过去 |
Build Action 属性则复杂多了, 下面是VS2010中, Silverlight 4 项目资源文件的Build Action 属性截图。
注意,上面罗列了一些不适合资源文件的 Build Action 属性,在使用资源文件时,可以忽略这些。
| None | 资源既不会被集成到程序集内,也不会打包到xap包中。不过我们可以通过设置CopyToOutputDirectory选项让其自动拷贝到xap包所在目录。 这种情况下, 访问这个图片的相对Uri需要以"/"开始。 适用场景: 在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用。 类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用。 |
| Compile | 不适合用于资源文件。 类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件。 |
| Content | 资源会被打包在Xap包里面。 这种情况下, 访问这个图片的相对Uri需要以"/"开始。 在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件, 如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用。 |
| Embedded Resource | 这种方式会把文件嵌入到程序集中,silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用,微软不建议在silverlight采用这种方式在程序集里嵌入资源。 如果有这种需求可以用 Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的stream引用。 |
| ApplicationDefinition | silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"。其他文件都不适合用这个。 |
| Page | 不适合用于资源文件。 所有的用户控件, 页面和子窗体(usercontrol/page/childwindow)的xaml文件应该采用的生成操作。 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件。 采用"Page" build action时xaml里的错误会导致工程无法正确生成。 |
| CodeAnalysisDictionary | 代码分析使用,Silverlight中可以忽略 |
| Resource | 资源会被打包在程序集内部。 选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。 可以用相对于当前的XAML文件的相对Uri访问, 如<Image Source="silverlight.png" /> 或是<Image Source="./silverlight.png" />, 在子文件夹里的可以用 <Image Source=”./images/sl.jpg” />访问到。 最保险的方式是采用特有的程序集资源URI访问,格式为 <Image Source="/{assemblyShortName};component/Foo.jpg"/>, 这种方式还可以引用到xap中的其他程序集中的图片。 这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。 |
| SplashScreen | "SplashScreen"是这个选项是WPF的启动画面使用的。 silverlight启动加载画面是用的其他方式实现的, 所以在silverlight里不要用这个方式。 |
| EntityDeploy | 这个是EntityFramework采用的生成方式, 在silverlight里是没用。 |
参考资料:
分析silverlight里的URI引用资源文件的各种情况
http://bbs.blueidea.com/viewthread.php?tid=2941697
Silverlight图片相对路径的设置
http://www.cnblogs.com/yangfan/archive/2009/12/14/1623647.html
关于Silverlight资源文件(如:图片)的放置位置及其引用(相对路径)
http://www.cnblogs.com/star250/archive/2009/10/15/1583665.html
Silverlight资源文件
http://msdn.microsoft.com/zh-cn/library/cc296240(VS.95).aspx
图片等资源的引用路径问题
http://www.cnblogs.com/kevinyang/archive/2008/11/16/1334712.html