微软已经开始正式对系统更新的使用者强制检查其所使用的 XP系统是否为盗版的检查,若发现盗版,系统自动更新后,每次启动都提示"您可能是软件盗版的受害者",进入桌面后右下角启动栏里有一个五角星的图案.
相关报道:
即日起微软将启动「正版Windows客户权益独享计划1.0 」 (Windows Genuine Advantage 1.0 , WGA 1.0),用户进入下载中心必须验证是否正版软件,若为盗版软件则不能下载,但是自动更新(Automatic updates)不在此限,所有的用户都可以自动更新修补漏洞。用户在第一次进入Windows update、Microsoft update及Download Center网站进行下载时,将被要求参与WGA验证程序。客户须要下载一个ActiveX控制程序,此程序将自动验证用户计算机所使用的是否为正版 Windows软件。若通过验证,将会有一组Download Key储存在客户计算机中,作为将来进入微软网站进行下载动作时计算机自动辨识之用,微软表示,此验证流程不搜集任何可用来辨认或联络使用者的信息。验证流程已经改善并简化。验证程序将自动验证用户计算机所使用的是否为正版Windows软件,用户不再需键入25码的产品序号,就可以轻松的完成验证过程,大幅降低客户进行验证时的负担。换句话说使用盗版Windows操作系统的用户,将不能直接从下载中心下载Windows Media Player、Antispy等软件,但是依然可以透过自动更新来修补漏洞。
手工解决方法:
方法一:
1.IE => 工具=>Internet 选项 => 程序=> 管理加载项=>IE已经使用的加载项=>Windows Genuine Advantage Validation Tool=>禁用=>然后再上线更新,这样就不会验证了。此WGA(Windows Genuine Advantage Notifications)组件对应文件:legitchechcontrol.dll。WGA是反盗版自动更新验证ActiveX组件,这个正版检验程序植入系统后,会在每次系统启动时,透过网络回报讯息给微软的网站。没更新过的计算机里没有此组件,So..先去update下载此组件后再用此方法去停用此组件,以后即可自动更新了。
2、移除验证码:
计算机=>控制面板=>添加或删除程序=>Windows Installer 3.1(KB893803)=>删除=>重新下载更新档=>windows genuine advantage 不要勾选=>完成。保证不会再出现了(Windows Installer 3.1是修复windows installer安装错误或者提示无法修复MSI出错的微软官方补丁)
3.重启你的计算机,进入安全模式,登陆管理员帐号--保证你拥有进入Windows\system32以及Windows\system32\dllcache路径的权限。在这两个路径下均有一个名为WGATray.EXE的文件。你必须将两个路径下的WGATray.EXE均删除--这将阻止Windows在启动时弹出“盗版XP”气球。
在删除Windows\system32下的WGATray.EXE可能需要一点技巧:
步奏一:WGATray.EXE图标-->右键-->删除-->出现删除确认框后先不要按‘确定’按钮
步奏二:Ctrl+Alt+Del-->打开进程管理器-->找到WGATray.EXE-->删除-->出现删除确认框后先不要按‘确定’按钮
步奏三:先按打开进程管理器的删除确认键,然后用最快速度按步奏一的删除确认键。
步奏四:如果Windows\system32下的WGATray.EXE不会出现,代表操作成功。继续删除Windows\system32\dllcache下的WGATray.EXE。
4.进入注册表,进入
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows NT\CurrentVersion\Winlogon\Notify
删除其中的“WGALOGON”文件夹--这将Windows将无法加载任何有关WGA的DLL文件。
重启计算机,你将暂时告别微软正版增值计划的“骚扰”。
方法二:
在进入Window update 网页后选择「Express(快速)」或「Custom(自订)」按钮前,在 IE 地址栏输入:
void(window.g_sDisableWGACheck='all')
再按下ENTER后,再选取你要更新的方法"快速","自订"即可
此法可以用来破解微软反盗版的检查。系统就不会查你是用什么版本的WIN了
能保证系统更新还是很有必要的。系统更新的目的多数就是防止电脑病毒的需要。
对于使用VOL免激活版(上海政府、xx银行等)的用户,可以使用替换序列号的简单办法。因为目前尚有部分VOL序列号未被封,并且可以通过正版验证。
HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT (番茄花园版就是使用的这个序列号)
MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版)
QC986-27D34-6M3TY-JJXP9-TBGMD(台湾交大学生版)
点击下载此文件
替换后请到C:\Documents and Settings\All Users\Application Data下删除Windows Genuine Advantage文件夹。以后即可通过正版验证。
如果XP是很老的破解版本(比如零售版的破解版本)用户,无法使用上述序列号,请下载RemoveWGA工具。RemoveWGA 是一个专门用来清除 WGA 的小程序,使用者只要通过它,就可以阻止微软的 WGA 在系统每次启动时企图连回微软网站的动作,且使用它并不需要担心微软的正版验证机制,你还是一样能够正常的使用 Windows update 的功能,两者之间并没有任何冲突。虽然系统仍是破解的,但将不会再有任何提示,和以前没有变化。注:该工具会被部分杀毒软件识别为病毒。如须使用,下载前可能需要暂时禁用或者关闭一下病毒防火墙。使用过后再恢复。
华军下载地址:http://www.onlinedown.net/soft/6914.htm
下载地址
1、下载后安装、右键选择vs2005中的项目、会出现一个选项"Add Web Deployment Project"(http://www.cnblogs.com/chy710)
2、选择添加一个WebDeployment Project(输入程序集名称和发布地址)
3、此时解决方案中会多出一个项目(http://www.cnblogs.com/chy710)
4、右键选择该项目设置相应属性
5、右键选择该项目选择“生成”、此时会发布网站到指定的目录、生成DLL文件同vs2003一样、更新时只需上传DLL文件
(http://www.cnblogs.com/chy710)
WDP
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。
15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
根据公式(1)进行计算:
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 2/11
∑(ai×Wi)(mod 11) = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
C#代码:
private string per15To18(string perIDSrc)
{
int iS = 0;
//加权因子常数
int[] iW = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
//校验码常数
string LastCode = "10X98765432";
//新身份证号
string perIDNew;
perIDNew = perIDSrc.Substring(0, 6);
//填在第6位及第7位上填上‘1’,‘9’两个数字
perIDNew += "19";
perIDNew += perIDSrc.Substring(6, 9);
//进行加权求和
for (int i = 0; i < 17; i++)
{
iS += int.Parse(perIDNew.Substring(i, 1)) * iW[i];
}
//取模运算,得到模值
int iY = iS % 11;
//从LastCode中取得以模为索引号的值,加到身份证的最后一位,即为新身份证号。
perIDNew += LastCode.Substring(iY, 1);
return perIDNew;
}
设置Apache虚拟目录
httpd.conf文件中加一行
Alias /vd "d:/vd/"
表示将d:/vd/目录设置为虚拟目录/vd/,那么你在d:/vd/下的文件,就可以通过在浏览器中输入“http://127.0.0.1/vd”访问。
注:当然你可以写成
Alias /vd/ "d:/vd/"
但是这样的话,你要输入http://127.0.0.1/vd/才能访问,而上面那种只要http://127.0.0.1/vd
2000/XP/2003 下 IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置
(假设 C:\ 为你现在所使用操作系统的系统盘,如果你目前操作系统不是安装在 C:\ ,请自行修改。)
一、安装 IIS(Windows2003只要安装“应用程序服务器(IIS,ASP.NET)”即可跳过此步):
(1)插入系统盘;
(2)进入控制面板-》添加或删除程序-》添加/删除Windows组件-》在“Internet信息服务(IIS)打勾-》下一步安装。
(3)安装完成后在浏览器地址栏输入 htt://127.0.0.1 检查是否安装正常。
如果没有系统盘,那么下载 IIS 5.1 的安装包(for XP),重复上述步骤,安装时指定路径即可。
IIS下载地址:http://soft.mumayi.net/downinfo/2597.html
二、安装 PHP:
(1)官方下载:http://www.php.net/downloads.php。
(2)下载后得到 php 的 zip 压缩包,解压至 C:\php(这个路径可以随意,下面要是用到这个路径,请相应修改);
(3)将 C:\php\libmysql.dll 和 C:\php\ext\php_mysql.dll 复制到 C:\Windows\system32 下;
将 C:\php\php.ini-recommended 复制到 C:\Windows (Windows 2000 下为 C:\WINNT)并将改名为php.ini,
然后用记事本打开,利用记事本的查找功能搜索:
搜索“; Windows Extensions”并仅打开需要的模块以节省内存(去掉每个模块前的;号即可):
extension=php_gd2.dll
GD库支持,支持水印。
extension=php_mbstring.dll
支持phpMyAdmin
extension=php_mysql.dll
支持MySQL。
(4)配置 IIS 使其支持 PHP
在“控制面板”的“管理工具”中选择“Internet 服务管理器”,
然后在左侧选择你需要支持 PHP 的 Web 站点上单击右键选择“属性”,
在打开的“Web 站点属性”窗口的“ISAPI 筛选器”标签里找到并点击“添加”按钮,在弹出的“筛选器属性”窗口中的“筛选器名称”栏中输入:PHP,再将可执行文件指向 php5isapi.dll 所在路径,如:C:\php\php5isapi.dll。
打开“Web 站点属性”窗口的“主目录”标签,找到并点击“配置”按钮,在弹出的“应用程序配置”窗口中找到并点击“添加”按钮,在弹出的窗口中新增一个扩展名映射,扩展名为 .php ,单击“浏览”将可执行文件指向 php5isapi.dll 所在路径,如:C:\php\php5isapi.dll,然后一路确定即可。
再打开“Web 站点属性”窗口的“文档”标签,找到并点击“添加”按钮,向默认的 Web 站点启动文档列表中添加 index.php 项。您可以将 index.php 升到最高优先级,这样,访问站点时就会首先自动寻找并打开 index.php 文档。
确定 Web 目录的应用程序设置和执行许可中选择为纯脚本,然后关闭 Internet 信息服务管理器。
2003系统配置:在“Internet 服务管理器”左边的“WEB服务扩展”中设置:
ISAPI 扩展允许
开始-》运行-》输入“iisreset”,重启IIS。
在 IIS 根目录下新建一个 phpinfo.php,内容如下:
<?php
phpinfo();
?>
打开浏览器,输入:http://127.0.0.1/phpinfo.php,将显示当前服务器所支持 PHP 的全部信息。
三、安装 MySQL:
(1)官方下载:http://dev.mysql.com/downloads/mysql/5.2.html
custom
安装
Skip Sign-Up
Finish
Next
Standard Comfiguration
设置数据库密码
(重要)重新启动电脑!
四、安装 Zend Optimizer :(有需要时安装)
(1)官方下载:http://www.zend.com/products/zend_optimizer
(2)安装时只需选择Web服务器为iis,指定php.ini路径即可。
五、安装 phpMyAdmin:(用于管理MYSQL数据库,可选择)
下载 http://www.phpmyadmin.net,将其解压到站点根目录,
找到 ./libraties/config.default.php,做以下修改:
方案一:
搜索 $cfg['Servers'][$i]['auth_type'] 设置为config
搜索 $cfg['Servers'][$i]['user'] 用户名一般为root
搜索 $cfg['Servers'][$i]['password'] 设置MySQL的密码
打开浏览器,输入:http://127.0.0.1/phpMyAdmin/ ,若 IIS 和 MySQL 均已启动,即可浏览数据库内容。
(此设置允许任何人通过以上路径登录管理数据库,安全性极低)
方案二:
搜索 $cfg['Servers'][$i]['auth_type'] 设置为cookie
搜索 $cfg['Servers'][$i]['user'] 用户名一般为root
搜索 $cfg['PmaAbsoluteUri'] 访问路径,设置为http://127.0.0.1/phpmyadmin/
搜索 $cfg['blowfish_secret'] 这是cookie作用域,设置为127.0.0.1
(此设置只允许本机上登录,并且需要输入用户名密码才能登录,安全性极高)
-----------------------------------------------------------------------------------
至此所有安装完毕。以上配置在所有老版本软件中不一定有效,强烈推荐下载最新版本的软件。
简单安装过程:请各位注意安装顺序
----------------------------------------------------
(一)Apache:
装在默认目录。安装-自定义-全部选中。
----------------------------------------------------
(二)PHP:
第一步:压缩C:\php5目录下。
第二步:(将PHP目录添加到PATH环境变量中)开始 -> 控制面板 -> 系统 -> 高级 -> 环境变量 -> 系统变量 -> Path -> 双击 -> 加入“;C:\php5”
第三步:将C:\php5\php.ini-recommended 重命名为 php.ini 。
用记事本打开 php.ini ,查找register_globals = Off,把off改成On (有二处)
查找short_open_tag = Off,把off改成On 有一处
查找extension_dir = "./" 改为 extension_dir = "C:\php5\ext"
查找;extension=php_mbstring.dll,把下面几句前面的分号去掉
extension=php_mbstring.dll
extension=php_dba.dll
extension=php_dbase.dll
extension=php_filepro.dll
extension=php_gd2.dll
extension=php_imap.dll
extension=php_ldap.dll
extension=php_mysql.dll
修改了一些文件上传以及内存使用最大限制:
memory_limit = 20M 内存容量
post_max_size = 20M 闪存容量
upload_max_filesize = 20M 附件容量
保存退出。
第四步:(使php.ini文件在Windows下被PHP所用)
开始 -> 控制面板 -> 系统 -> 高级 -> 环境变量 -> 系统变量 -> 新建 -> 输入“PHPRC” -> 在“变量值”中输入 php.ini文件所在的目录(例如:C:\php5)
点击“确定”
Microsoft Windows 下的 Apache 2.0.x
先停止Apache
用记事本打开C:\Apache2\conf(可能在C:\Program Files\Apache Group\Apache2\conf)下的httpd.conf
这个文件我改了几个地方:
把PHP直接作为apache的一个模块运行,我在里面加了两句:
查找到 #LoadModule ssl_module modules/mod_ssl.so 在它的下面一行加上
LoadModule php5_module "C:/PHP5/php5apache2.dll"
AddType application/x-httpd-php .php 注意点前面有个空格滴,大家最好用复制粘贴
(新版apache2.2的php5apache2_2.dll在外面,放上去同理用)
我在D盘下建立了一个www的目录用于存放我的站点文件,在http.conf里改了这样一句话:
把
DocumentRoot "C:/Program Files/Apache Group/Apache2/htdocs"
改成了
DocumentRoot "D:/www"
所有
Apache2.0.x于1.3.x相比2.0.x默认不能直接列目录,如需,就改:
把DocumentRoot "E:/www"这句下的如下语句
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
改为:
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
修改目录的默认首页:
如:DirectoryIndex index.htm index.html index.php index.html index.html.var
别的就没再动什么地方,保存后退出。
注意一点的是,要使以上所有这些配置生效需要重新启动电脑
最后我们来测试PHP是否正常载入。打开记事本,输入
<?php
phpinfo();
?>
保存,在弹出的窗口中,文件类型选所有文件,文件名为phpinfo.php,保存位置为网站目录下。如(E:\www\phpinfo.php)
打开IE浏览器输入:http://localhost/phpinfo.php 如果能正常显示就OK了。
-------------------------------------------------------
(三)Zend:
先停止Apache
安装Zend Optimizer也很简单,安装中它会两处提示其一:选择那种服务器?请选择Apache。其二:PHP.ini的路径?请选择C:\PHP5。其它的按默认配置安装就行了。OK安装完后我的Zend目录就是C:\Zend。
-------------------------------------------------------
(四)Mysql:
【原文地址】First Look at Using Expression Blend with Silverlight 2
【原文发表日期】 Thursday, February 28, 2008 9:36 PM
上个星期,我写了一个《Silverlight 2 初览》的贴子,讨论即将发布的Silverlight 2 Beta1 版。在该贴子里,我给出了一些我撰写的系列教程的链接,这些教程示范了Silverlight和WPF后面的一些根本性编程概念,以及演示如何使用它们来建造一个Silverlight版的“Digg搜索客户端”应用:
在这第一套Silverlight教程里,我没有使用可视化的设计工具来建造用户界面,而是注重于展示底层的XAML UI标识(我认为这有助于更好地解释核心编程概念)。既然我们完成了对基本概念的讨论,让我们来探究一下可为我们所用,变得更有效率的一些工具。
Expression Blend对Silverlight的支持
除了即将发布Silverlight 2的Beta1版本外,我们还将发布针对这个版本的Visual Studio 2008 和 Expression Studio 的工具支持。这些工具将为建造RIA应用提供强有力的支持,是设计来允许开发人员和设计师轻松地合作开发项目的。
在今天的贴子里,我将介绍即将发布的Expression Blend 2.5三月份预览版的一些功能。在演示关于Blend是如何工作的一些基础的东西之后,我们将用它来建造一个跨平台,跨浏览器的 Silverlight IM聊天客户端:
上面的屏幕截图展示了在MAC上运行时该应用的样子,下面是在Expression Blend中该应用设计时的屏幕截图:
我们将使用Expression Blend,用可视化方法构造该应用所有的用户界面,以及使用它来干净地将UI数据绑定到代表我们的聊天会话和消息的.NET类上。
我们用来建造聊天应用的所有控件都是Silverlight 2的Beta1版的一部分。
声明:我不是设计师(也不很酷)
让我预先声明,我是个开发人员,不是个设计师。我也不是很酷。虽然我理解创建用户界面的技术,但在组合界面时,我有时会挑选很差的颜色和字体(就在我弄完本贴的屏幕截图之后,有个同事十分有助地指出,实际上有个致力于取缔我使用的一些字体和颜色的专门网站,哎,很受打击)。
我想对你们中那些有艺术细胞的人说,请对我温柔点,将你的注意力集中在我在下面演示的功能和技术上,别针对我使用的字体和颜色选择, :-)
起步: 创建一个新Silverlight 2项目
Expression Blend 和 Visual Studio 2008共享同样的解决方案/项目文件格式,这意味着你可以在VS 2008中创建新的Silverlight 项目,然后在Expression Blend 中打开,或者你也可以在Expression Blend 创建新的Silverlight 项目,然后在VS中打开。你还可以使用Expression Blend和VS 2008同时打开和编辑同个项目。
因为在我先前的Silverlight教程系列中,我已经展示了如何使用VS 2008来创建一个新Silverlight项目,让我们用这个贴子来展示如何使用Expression Blend来创建一个新的Silverlight应用。要做的话,只要在Expression Blend中选择 文件->新项目 ,选择Silverlight 2 Application图案,然后点击OK:
这会创建一个新的(与VS相兼容的)解决方案文件和Silverlight应用项目:
Blend包括了一个面向Silverlight 2应用的完整的所见即所得的设计器。在打开Silverlight页面和控件时,你可以在设计视图,XAML源码视图,或者同时显示设计视图和XAML源码视图的分割视图之间转换设计表面(支持同步编辑)。在上面我们使用了分割视图这个选项。
理解一些基本的东西:往表面上加控件
Expression Blend拥有一个与Visual Studio稍微不同的工具调色板(tool palette)(与你在像Photoshop这样的设计工具里的找到的调色板更相似些)。
Blend支持矢量图像编辑:
Blend还支持添加和操作控件。在放置布局控件(Grid, Stack, Canvas, Border, ScrollViewer等),文本控件(TextBox, TextBlock等)的工具箱中,有个特殊的图案,以及一个显示你最近用过的控件的图案:
点击工具调色板上最后面的">>"图案会显示可为你所用的所有的控件:
确认点击了Asset Library的右上角的“Show All(显示所有控件)”的复选框,如果你看不到你在找的控件的话。你还可以使用“搜索”文本框,来按名称过滤所显示的控件。
重要注意事项: Blend对所有控件都支持一种设计体验(无论是内置的控件还是第三方的控件或你应用引用的用户控件)。
在你从工具箱里选中一个控件后,你可以在设计表面点击,拖拉,画出控件来。你也可以把控件从asset工具拖拉到artboard上。在默认情形下,当你在设计表面上添加控件,与之交互时,你将得到自动的尺子和定位标记 (下面是一个带有内置按钮,日历和slider控件的表单):
理解其他基本的东西:操作控件属性
你可以在设计表面上选择任何对象,然后在屏幕的右手边点击“属性”面板,来定制它的属性:
在上面,我在把按钮的“背景”画刷改成渐变的深蓝(deeper blue gradient)(在“Brushes(画刷)”节点下面用红笔圈中的第三片,它允许我们配置渐变式的画刷)。
有用的小技巧: 属性窗口的上方包含一个搜索框,你可以用它来过滤可见的属性名称:
因为Silverlight和WPF中所有的UI对象都是使用矢量图像组成的,我们可以任何方式对控件进行变形,样式化,转换。例如,我们可以设置我们的按钮控件的Transform属性或者点击它的边角来旋转,倾斜,扩缩它:
这给与我们很大的威力和灵活性,来快速和轻松地定制我们想要的体验:
有用的小技巧: 你可以按住CTRL键来放大或缩小设计表面,然后使用你的鼠标的滑轮来控制放缩的深度。然后你可以通过按住空格键来移动设计表面的可见区域,这会导致手形光标的显示,然后你可以按住鼠标,用它来把当前可见的区域在屏幕上拖拉。后面这个小技巧在你放大得太多,想轻松地移动可见内容时会非常有用。
建造我们的聊天应用: 定义布局
在我先前的Silverlight教程系列中的第二部分:使用布局管理 (木野狐译)中,我曾谈到Silverlight和WPF中的布局管理系统,以及如何使用布局面板来轻松地控制应用的布局和流程。Expression Blend可以使得定义布局规则变得容易,还包括使用这些布局面板的内置工具支持。
记住,我们建造聊天应用的目标是拥有象这样的UI:
要达成这个目标,我们先在网页上定义三行的<grid>布局,我们可以这么做,把鼠标悬浮在设计表面的左边缘,然后点击我们想生成新的行定义的地方(在下图中,我已经建立了顶行的定义,用红笔圈出的光标所在表示我将点击来添加第二行定义的地方):
点击设计表面的左上角(下图红圈处)允许我们转换设计表面是处于 Canvas 布局模式还是Grid布局模式:
在Grid布局模式中时,Blend 会告诉我们某个行或某个列是否有固定的宽度,或是否与控件的尺寸成比例关系。上面的“空锁(empty locks)”表示这三行之间目前成比例关系(意味着它们会按比较增加,如果我们加大浏览器的大小的话):
如果我们点击顶部和底部的锁的话,我们可以把这些行设置成拥有固定的高度,而让中间一行填充剩下的高度:
我们要做的最后一步是点击顶部的边缘,再定义一个右手的列,我们将其设置成拥有固定的宽度(让左边那列动态地改变大小):
在做完上面的步骤之后,我们的XAML文件将有一个定义成下面这样的Grid:
有用的小技巧: 在上面,我们对我们的Silverlight应用设置了固定的宽度和高度(注意<UserControl>根元素上的Width 和 Height属性)。我们也可以完全去掉Width和Height属性,致使应用拥有动态的大小,自动地流式改变大小来适合包含它的HTML元素或浏览器窗口的大小。(我曾在这里的教程的结尾谈到过这个技巧)。如果我们要给我们的应用设置设计时的宽度和高度,我们可以在根UserControl元素上设置 d:DesignWidth="640" 和 d:DesignHeight="476" 属性。这会在使用设计器来设计应用时,致使设计器使用该尺寸的大小。
建造我们的聊天应用: 添加控件和颜色
至此,我们定义了我们的聊天应用的核心布局,让我们往里面加些控件,开始定制它的外观。
我们将先选择根Grid布局面板,定制它的背景颜色为渐变的蓝色(blue gradient)。可为我们所用,选择一个特定控件的一个简单的方法是使用“Interaction(交互)”面板,然后点击我们想选择的控件:
然后我们可以使用“"Brushes(画刷)”属性面板来定制一个蓝色的 LinearGradient 画刷为Grid的背景:
设置完成后,我们可以开始操作聊天窗口的底部,加一个“Send”(发送)按钮:
至于我们的聊天消息文本框,我们则将使用一个标准的文本框。但要加点活力,我们将先加一个RoundRadius为5的边框控件,然后加象这样的Background(背景)和BorderBrush(边框画刷):
然后我们在Border控件中嵌入我们的TextBox。
重要的小技巧: 为使用设计表面把TextBox嵌套在Border控件之中,我们需要在Interaction窗口中双击Border控件。这会将其设置成设计表面上的当前可插入控件,象下面这样用黄色高亮显示:
然后我们可以使用控件工具箱选择一个TextBox控件,将其加进Border控件。我们将设置TextBox的背景和边框画刷从父控件Border处继承其好看的曲线型外观:
Blend生成的XAML标识看上去象这样(注意,TextBox是内嵌在Border控件之中的,如果Border不是当前插入控件的话,是不会这样的):
我们也可以对header行重复上面的过程,将一个TextBox嵌入一个Border控件中,在右列里加一个图片控件,创建出象这样的UI:
由Blend生成的XAML标识会看上去象下面这样:
最后,绝对不是最不重要,我们将在中间一行添加另一个Border控件,往其中加一个ListBox控件。我们将配置Border控件延伸跨越Grid的两列,将它的背景和前景颜色进行定制。然后我们在ListBox加一些测试消息作为站位文字(我们将在后面对UI进行定制,并将其绑定到实际数值):
由Blend生成的XAML标识将看上去象下面这样:
至此,我们运行应用的话,我们会有一个在浏览器中运行的基本的聊天IM客户端(带硬写的值)。在我们改变浏览器大小时,应用会自动流动,改变大小以适合窗口:
我们还有一堆UI活要干,使我们的IM客户端看上去不至于很粗糙,但至少我们现在有东西可以运行了。
建造我们的聊天应用: 添加ChatMessage和ChatSession 2个类
至此,我们在Expression Blend中创建了初始的UI,让我们在 Visual Studio 中打开同个项目,加些我们可以绑定到UI的一些聊天类。
我们可以在 Visual Studio中选择 VS 2008 中的文件->打开项目,然后选择我们项目的项目文件来打开项目,或者在Expression Blend中我们可以右击项目节点,然后选“Edit in Visual Studio(在Visual Studio中编辑)”菜单项来启动打开了项目的VS 2008:
Beta1版本中的VS 2008的Silvelight支持包括对Silverlight 2方案的项目管理支持,完整的Intellisense和事件连接支持,以及对在Windows和Mac上运行的Silverlight应用的调试支持。VS 2008还支持对Silverlight .xaml文件的分割视图的编辑。譬如,下面是我们在Blend 建造的同个Page.xaml 文件,在VS2008中打开后的样子:
Beta1版的VS 2008设计视图并不是可交互的(意味着还是只读)。但你在源码视图中做的变动会马上在设计视图中更新,这给予你一个很好的XAML-pad的体验(在Silverlight 2 Beta1中,VS 2008支持完整的XAML源码intellisense)。
在这个博客贴子里,我们不会使用Visual Studio的XAML编辑器,而是将创建一些类,我们可以用来代表ChatSession以及相关的聊天消息。然后我们将使用Expression Blend将我们的UI控件绑定到这些类上。
我们先加一个定义了2个公开属性的叫“ChatMessage”的新类:
然后我们将创建一个叫“ChatSession”的类,它代表了一个聊天会话:
上面的ChatSession类有三个公开的属性,前2个属性代表远程聊天对象的用户名和avatar。
第三个属性是过去聊天消息的集合。注意,它的类型不是List<ChatMessage>集合,而是一个ObservableCollection<ChatMessage>集合。ObservableCollection对你来说,也许是个不熟悉的类型,假如你来自ASP.NET背景的话,但对那些来自Windows Forms或WPF背景的,大概会非常熟悉。基本上来说,这是个泛型集合类,往其中添加或去除条目时(或者其中的条目实现了INotifyPropertyChanged的话,在属性变动时),它会发出变化通知事件。这在做数据绑定时会非常方便,因为UI控件可以使用这些通知来知道自动刷新它们的值,而不用开发人员编写代码来显式地这么做。
ChatSession 还有2个公开的方法,其中一个方法的任务是连接到聊天服务器上去,另一个方法的任务是向聊天服务器发送消息。为简单起见(也因为我没有聊天服务器),我会对2个方法做假的实现。在实战中,我们大概会使用内置于Silverlight的网络socket实现连接到一个远程的聊天服务器上去。
ChatSession类实现了INotifyPropertyChanged接口,意味着它会呈示一个公开的PropertyChanged事件。在这个类中,我们会在改变它的属性时,触发这个事件。这会在属性值发生变化时,通知监听者(例如,与它数据绑定的控件),以允许它们重新绑定数据。
为设计时数据绑定实现假的数据
从纯粹功能性的角度来说,上面的代码是为实现我们的聊天客户端所需的所有的代码。但为帮着改进在Blend中的设计时体验,我们还将加一个构造器,检查我们是处于运行时模式还是设计模式,如果宿主于设计器里,那么就给ChatSession装载假的数据:
一会儿我们就会看到这是如何方便在设计器里呈现数据绑定之数据的。
建造我们的聊天应用: 在Expression Blend中使用数据绑定连接UI
既然我们定义了ChatMessage和ChatSession对象,我们可以在Expression Blend 中用它们来绑定到我们的UI控件了。
在我上个星期的《教程第五部分:用 ListBox 和 DataBinding 显示列表数据》 (木野狐译)中,我介绍了Silverlight和WPF中数据绑定的工作原理。在今天的贴子里,我们将使用Expression Blend 来连接数据绑定表达式,而不是手工输入这些表达式。我们将先使用Blend中Project面板下的"Data"面板:
我们将点击Data面板中的“+ CLR Object”链接,调出一个对话框,允许我们挑选任何.NET对象来数据绑定到我们的UI控件。我们将用它来选择我们刚创建的“ChatSession”对象:
这会把ChatSession对象加到我们的Data托盘上去,将它的属性(以及子属性)显示在一个树形视图里:
然后我们就可以在设计视图里通过选择Data托盘里的这些属性,把它们拖放到设计表面上的UI控件上,来绑定任意一个UI控件到这些属性上。例如,我们可以把RemoteUserName属性从Data托盘上拖拉到静态的"ScottGu"标签上,将它换成{Binding RemoteUserName} 数据绑定表达式:
当我们把“RemoteUserName”属性拖放到TextBlock上时,Blend会象上面那样问我们,是绑定这个属性到现有的TextBlock,还是创建一个新的控件来代表这个属性。如果我们选择默认的行为(绑定到现有的控件上),Blend就会询问我们想要的绑定表达式的类型:
我们表明我们要“OneWay(单程)”绑定到TextBlock的“Text”属性上去。当我们点击OK时,我们的控件的“Text”属性就会被更新为 {Binding RemoteUserName} 表达式。
我们可以重复这个拖放交互过程,把Image控件绑定到RemoteAvatarUrl 属性,也把 ListBox 绑定到MessageHistory集合属性上。完成之后,Blend就会象下面这样在设计视图表面中显示我们的伪数据:
你也许会对ListBox的内容感到疑惑,为什么条目都显示成了“ChatClient.ChatMessage”?那个么,目前ListBox是绑定到了自定义的.NET 对象的集合,“ChatClient.ChatMessage”字符串是调用ChatMessage实例的“ToString()”方法返回的值。
我们可以象这样,加一个<DataTemplate>到ListBox来修改它,让它好看些:
注: 在Blend 2.5 三月份的预览版中,你只能在源码视图中定义数据模板。在将来的预览版中,你将能够使用设计器来定义它们。这个功能已经在WPF中实现,如果你想试验一下的话。作为一个设计师,你可以交互式地创建数据的外观,完全的所见即所得的体验。去创建一个WPF项目试一下。
这么做的结果,会使得我们的UI在设计时看起来象下面这样:
在设计时显示这些“伪数据”的好处是,它允许我们对在运行时UI体验是什么样的会有一个比较好的感觉,允许设计师(或开发人员)轻松地设计UI,而不需要等待应用的其他部分的完成。
建造我们的聊天应用: 使用样式和控件模板更新我们的Button和ListBox的UI
在我的《第七部分:使用控件模板定制控件的观感 》Digg教程中谈到的一件事情是,关于Silverlight和WPF如何允许开发人员和设计师完全定制控件的观感(look and feel )的。这提供了巨大的灵活性来精雕细琢应用的UI,以创建恰如其愿的用户体验。
我们可以使用Silverlight和WPF的控件模板特性来定制我们上面聊天应用的Send按钮和ListBox结构,以构造稍微好看的观感。我们可以这么做,创建 "MessageHistory" 和 "SendButton" 样式资源,将之保存在项目的App.xaml文件中。每个样式对象可以有一个控件模板,修改了控件的观感和改变它的视觉结构。
注: 在Blend 2.5 三月份的预览版中,你只能在源码视图中定义数据模板。在将来的预览版中,你将能够使用设计器来定义它们。这个功能已经在WPF中实现,如果你想试验一下的话。作为一个设计师,你可以交互式地创建数据的外观,完全的所见即所得的体验。去创建一个WPF项目试一下。
例如,下面的ListBox控件模板可以用来去除ListBox控件周围的外圈双边框,定义一个只有列表容器卷动条的“平(flat)”的外观:
将这个模板施用到我们的ListBox上,将使得它显示出边缘周围平滑很多的样子:
我们可以用我们按钮的控件模板做得很花哨些,不光是定义一个自定义的按钮形状,还可以定义各种故事板动画来用于该形状,在它处于"MouseOver(悬浮)", "Pressed(按下)", 或"Normal(正常)"状态时, 提供自定义的UI行为(所有这些东西都可以封装在Style定义之中,意味着页面的开发人员不用做什么就可以启用这些东西):
在定义了"MessageHistory" 和"SendButton" 样式对象之后,很容易使用Expression Blend 将它们施用到设计表面的控件之上。
点击Expression Blend中的“Resources”工具窗口,它会列出我们项目中的所有资源地点:
我们可以展开“App.xaml”节点看其中我们可以使用的样式。要将一个特定样式施用到页面上的某个控件,我们只要将它拖放到该控件上就可以了。例如,这是在我们施用“SendButton”样式之前我们的发送按钮控件的样子:
将SendButton样式拖放到它之上,会将它改成使用我们自定义的控件模板形状/结构
因为我们的“SendButton”样式中定义了状态动画效果,按钮在运行时会随终端用户与之交互的方式的不同而变化。
在默认情形下,按钮看上去象这样:
当终端用户将鼠标移到按钮之上时,气球会微妙地变到比较淡的颜色:
在处于按下的状态时,按钮会陷下去,它的影子会消失:
在释放时,按钮又会冒起来。
这些微妙的动画和交互性姿态可以给应用增添一些色彩。最棒的是,设计师可以完全由他们自己建造和定制这些功能,实现页面功能的开发人员根本不用参与也不用编写任何代码,就可以启用这些功能。
在Expression Blend 2.5的将来的预览版中,设计师将不光能定义这个按钮的形状和结构,还能为它定义所有的动画过渡,全部使用设计表面(不需要编辑源码,也不用任何代码)。
实现我们的聊天功能
至此,我们使用Expression Blend对我们的控件UI做了数据绑定,还对UI的交互性做了修改和润色,让我们回到Visual Studio,来编写实现UI聊天行为功能的代码。
特别地,我们将向我们Page的构造器里添加下列代码,来开始与一个远程用户的ChatSession,然后处理“Send”按钮被点击,给远程用户发送一个消息时的场景:
在添加完上面的代码之后,重新运行我们的应用,我们将看到我们的UI现在数据绑定到了一个与RemoteUserName为"ScottGu" 的ChatSession(聊天会话),而不是我们早先定义的假的设计时数据。在消息文本框里输入文字,点击定制的Send按钮时,我们的ListBox会自动显示更新过的聊天历史:
你也许在疑惑为什么ListBox会自动更新?它这么做的原因是因为ListBox是数据绑定到ChatSession.MessageHistory属性上的,该属性的类型是ObservableCollection<ChatMessage>。这意味着,在一个新的 ChatMessage 对象添加进来时,该集合会自动触发变化通知事件,ListBox就会监测到这个事件,然后就会用新的数据更新本身。
不需要我们编写代码,就可以让ListBox对这些变化做反应。我们应用的干净的视图/模型绑定架构会自动为我们做处理。
结语
我只展示了Expression Blend支持的几个特性而已,所有这些特性在Silverlight和WPF项目中都工作的。所有这些功能都将在即将发布的Expression Blend 2.5三月份预览版中发布,不久这个预览版就可(免费)下载。
我想你会发现Visual Studio 2008 和 Expression Studio 会给建造出色的RIA解决方案带来巨大的生产力和威力。开发人员和设计师可以在开发相同项目时协作使用它们(而不用相互妨碍对方)。你还可以轻松地在一个机器上同时打开它们,用它们来同时编辑同一个应用。
在Expression Blend可以下载之后,我将在博客中对它做更多的讨论(以及我还没讨论过的其他一堆特性)。我还将在Silverlight 2 Beta1版发布之后,把上面的例程提供下载,这么你可以自己打开和运行其代码了。
希望本文对你有所帮助,
Scott
学 ASP.NET 已经有些时候了,也经常利用 AJAX TOOLKIT 所提供的控件为自己的项目增添功能和特效,AJAX 总能给用户非常良好的体验。
今天开始,我会陆陆续续把 ASP.NET AJAX 1.0 开发和部署方面的一些要点摘录下来,以便自己今后方便使用,并给 .net 初学者提供一些学习参考,文中有不正确的地方,希望各位批评指正。我的编程语言使用
C#,使用 VB.NET 的朋友相信也能看得懂。网上有许多在线翻译 C# 和 VB 代码的工具,不用我说知道怎么做了吧~
这里使用 Microsoft Visual Studio 2005 作为 Web 开发的平台,从微软官方下载 VS2005 以及 VS2005 SP1 进行安装。当然也可以使用
Visual Web Developer 2005 Express Edition 进行开发。
首先从 ASP.NET AJAX 官方网站http://www.asp.net/ajax/下载最新的
Framework。
安装 AJAX.NET Extensions v1.0,很简单,按提示操作即可。
启动 VS,新建网站,选择 ASP.NET AJAX Enabled Web Site。
接下来做个简单的演示功能:
打开 Default.aspx 的设计器视图,从工具箱拖入一个 ScriptManager 控件到界面,这是任何一个 ASP.NET AJAX 网页所必需的,并且在放在所有其它控件的上面,它可以放在母板页,但也要保证在所有其它控件的最上面。
往设计器视图拖入三个 Label 控件和一个 Button 控件。在 Page_Load 事件中写入:
Label1.Text = DateTime.Now.ToString();
Label2.Text = DateTime.Now.ToString();
Label3.Text = DateTime.Now.ToString();
这时运行程序并点击按钮,三个 Label 都同时更新时间。
然后从工具箱拖入一个 UpdatePanel 到页面,把 Label2 和 Button1 移入 UpdatePanel 中,再运行一次,这时发现当点击按钮时只有
Label2 的内容是更新的,另外两个 Label 的值不变。这就是 UpdatePanel 的作用:局部更新。
这是一种方法,如果我们的界面设计必需把这个 Button1 放在 UpdatePanel 外面,而当点击按钮时只需更新 UpdatePanel 的内容时,可以这样做:
把 Button1 从 UpdatePanel 中移出到外面,转到“源”视图,在 asp:UpdatePanel 标签内部加入 Triggers 标签,再内建标签
asp:AsyncPostBackTrigger 代码如下:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
</div>
</form>
运行,点按钮试试,是不是跟刚才一样的效果呢?
安装ASP.NET AJAX
安装Toolkit:
下载解压AjaxControlToolkit.zip移至
C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\AjaxControlToolkit
安装模板C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\AjaxControlToolkit\AjaxControlExtender\AjaxControlExtender.vsi
若安装失败,手工建立以下文件夹:
\My Documents\Visual Studio 2005\Templates\ItemTemplates\Visual C#
\My Documents\Visual Studio 2005\Templates\ItemTemplates\Visual Basic
\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual C#
\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual Basic
把SampleWebSite\Bin下的AjaxControlToolkit.dll和AjaxControlToolkit.pdb
复制至Binaries下。
打开VS,添加选项卡AjaxControlToolkit,添加项浏览至Binaries\AjaxControlToolkit.dll