玩转C科技.NET

每天都在学习,每天都在退步 为什么?世界发展太快! 怎么办?加快学习速度! 如何做?关注.NET社区 进阶中……

导航

<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

公告

Subscribe to this feed
Contact volnet online!

MSN群MyMSDN技术讨论群
群号:www.msdn@hotmail.com
Windows Live Alerts
欢迎大家踊跃加入讨论任何与技术有关的问题。
————————————
欢迎给我发送邮件:
volnet@tom.com
[标题格式]:[TO玩转C科技]<您的用户名/匿名>[<主题>]
————————————

 
您可以直接Gmail联系我噢!(Gtalk/Mail)
开机自启动,天天都在线哦!

LiveMessenger:
<My Library>

与我联系

搜索

 

常用链接

留言簿(4)

我参与的团队

我的标签

随笔分类(119)

随笔档案(105)

文章分类(15)

文章档案(15)

相册

家园建设

最新随笔

积分与排名

  • 积分 - 148550
  • 排名 - 243

最新评论

阅读排行榜

评论排行榜

2007年10月21日 #

如何让DIV固定在页面的某个位置而不随着滚动条随意滚动

     摘要:

1、使用了大量的计算,每次滚动,都少不了一大堆的运算。 2、使用了JavaScript脚本,脚本这东西受到浏览器的限制,即便没有限制,也同样因为网页的下载模式问题,可能因为脚本下载未完成或者下载失败而致使脚本无法正确运行。 3、条条大路通罗马,但是看看那方块,当快速滚动滚动条的时候,会发现那个可爱的方块抖动地厉害。这也难怪,那么多的计算谁能受得了?

  阅读全文

posted @ 2008-08-04 07:21 volnet(可以叫我大V) 阅读(1966) | 评论 (11)编辑

[WCF]Instance Management

     摘要: [有兴趣阅读本文的请从头至尾阅读,有兴趣帮助我解答疑问的请从尾至头读(红色部分),万分感谢!]我们很容易理解在旧有编程模型中关于类实例的内容。设计模式中Singleton也就是在描述着档子事。但基于WCF并非适合于以上场景,Service与Client之间要保持良好的Instance模型则需要依靠很多其他机制。Programming WCF Service Chapter4 对此进行了细致的描述。... 阅读全文

posted @ 2008-07-18 20:53 volnet(可以叫我大V) 阅读(1004) | 评论 (1)编辑

关于“指定的参数已超出有效值的范围。参数名 utcDate”的解决方案

很多朋友已经习惯了在组件或者页面开发时使用内嵌资源的方式进行资源输出,这样的好处包括如下一点,就是利用部分浏览器的相关机理来缓存这些文件而不必每次都加载,它们通常通过一个时间戳来表示该项内容是应该从缓存(客户端本地)中读取还是重新下载(远端服务器),而这个时间戳就被跟在了下载该资源的链接上了。

按说大家通常在测试的时候都是单机环境,因此通常不会发生什么问题,但是在生产环境中或者迁移到别人的机上就会出现一些问题了。

指定的参数已超出有效值的范围。
参数名: utcDate

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。
参数名: utcDate

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:

[ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。  参数名: utcDate]     System.Web.HttpCachePolicy.UtcSetLastModified(DateTime utcDate) +3352419     System.Web.HttpCachePolicy.SetLastModified(DateTime date) +47     System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context) +1904     System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +358     System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +64 


版本信息: Microsoft .NET Framework 版本:2.0.50727.1433; ASP.NET 版本:2.0.50727.1433

因为通常这时候网页并不会加载错误,所以我们可以很明确的知道并不是页面生命周期内发生了异常。如果是脚本资源,通常我们打开IE的脚本调试功能会弹出对象无法初始化的错误以及一些脚本异常。如果是css文件则会出现样式丢失的现象。既然不是页面生命周期内发生了错误,我们没有理由去检查代码,特别是当代码曾一度辉煌,我们更没有理由去那么怀疑。这时候我们有理由想到托管我们代码的IIS,仔细观察提示我们应该对utcDate有一个比较深的印象。如果我们的资源是在未来创建的呢?oh,这不可能,但是当我们将系统的时间改成比资源文件的创建时间更早的时候就有理由相信这一切就成为可能了。

解决方案:

1、通过修改服务器系统时间,让其比Assembly的时间要晚,则可以了。(这适合于Assembly是别人创建的时候,当然也适合自己拥有源码的时候)。

2、通过修改Assembly的创建时间,让其早于服务器的时间,则可以了。(这适合于服务器是别人的,当然也适合于服务器是自己的情况)。

posted @ 2008-05-27 01:19 volnet(可以叫我大V) 阅读(226) | 评论 (0)编辑

关于《博客园精华集》第一轮收录情况(仅针对2008年5月19日起的一些文章的记录)

首先,很高兴能够参与到《博客园精华集》一书的编定工作中来,为这个充满激情的团队而感到骄傲和自豪。

博客园就像知识的海洋浩瀚无边,2008年5月19日之前的文章我们将通过其他方式进行逐一审核统计,对于2008年5月19日之后的文章,将由我进行整理收录,但这并不代表您的大作会发表到博客园精华集,具体情况暂时不做过多说明,请关注相关公告。

对于2008年5月19日以后的文章我做几点说明,因为时间和精力的关系,我仅仅只能关注发表在博客园首页的文章,对于翻译和转载的文章将不予以收录,如果您的文章足够优秀而没有发表在首页的,请及时和我联系或者跟贴留言也可以。如果您的文章发表在首页,但是您根本不想被收录进博客园精华集,也请您与我联系或者跟贴留言。如果因为我的失误而导致了文章分类错误,请及时告诉我,我将根据实际情况为您解决。如果您还有什么疑问,请及时提出,我们将尽力为您解决。

最近一次更新:2008年5月29日

-1、其它

C#发现之旅第二讲 C#-XSLT开发

C#发现之旅第三讲 使用C#开发基于XSLT的代码生成器

蛙蛙推荐:蛙蛙教你索引邮件

使用动态代理,提高工作效率

深入 Unity 1.x 依赖注入容器之三:获取对象 (多)》

窗体传值,子窗体,父窗体,反射,reflection,windows,组策略,gpedit.msc,动态创建窗体,谢谢 2 3

在RedHat Enterprise 4 上安装 Mono1.9 (三)》(Linux)

适用于显示Web项目和DLinq调试信息的小程序

ASP.NET中OutOfMemoryException异常的处理方案
0、NA
1、设计模式

工厂模式兄弟姐妹

发布一个用Emit实现的对象创建工厂

重写报销流程,责任链模式实现

解耦的故事--权限设计
2、ASP.NET1.1
3、ASP.NET2.0

DinnerNow中的ASP.NET Ajax Extensions应用---选餐流程

net2.0多语言网页的实现

WebClient 保持 Session 和 Cookie

ASP.NET 2.0 Client Callback 浅析

可配置WebPart解决方案

Web上传文件的原理及实现
4、Web标准
5、网站维护、性能、安全经验、SEO

几种验证码方式对比

Log4Net - 写日志记录到Udp服务器(UdpAppender)
6、HTML/CSS
7、JavaScript

用javascript操纵GridView中CheckBox的两个常用技巧

用javascript/css实现GridView行背景色交替、点击行变色

[原创]jQuery小插件-collapsible

JavaScript 图片切换效果(ie only)

javascript事件监听

JavaScript面向对象编程(2)-- 类的定义
8、AJAX

利用回调实现脚本实体类和模拟Ajax

撰写自用的 ScriptManager 来管理客户端指令码

AJAX从服务端获取数据的三种方法
9、SliverLight
10、WPF

3ds Max建模,Blend设计,VS2008控制WPF的3D模型例子

[WPF疑难]ErrorTemplate显示与隐藏问题
11、WCF

DinnerNow中的WCF应用1 --- 首页数据加载

Extending WCF(四)—一个统一处理异常、日志的解决方案

WCF学习笔记-1 服务的定义与消费

Hello,Biztalk 2006 R2 BAM, WCF 集成

WCF传输大数据量DataSet
12、WF

WF3.5 的SendActivity、ReceiveActivity与WorkflowServiceHost(1)

DinnerNow中的Work Flow应用(上) --- 订单流程  (下)

坚持学习WF(9):本地服务之事件处理
13、LINQ

使用linq to xml 快速创建自己的Rss

使用linq to xml 快速创建自己的Rss 之二 Syndication篇
14、MVC

对Asp.Net MVC架构的用后感想

Asp.Net MVC 入门篇——Overview

ASP.NET MVC - 使用Post, Redirect, Get (PRG)模式

Asp.Net MVC实践 (基于ASP.NET MVC Preview 2)

Asp.Net MVC---Walkthrough

推荐一个基于Microsoft ASP.NET MVC Preview 2 的应用示例

ASP.NET MVC Preview3 bug 及期望 [集]

Asp.Net MVC实践 - 自定义ActionResult实现Rss输出 (基于ASP.NET MVC Preview 3)

Asp.Net MVC---Walkthrough
15、SharePoint/MOSS
16、VSTO
17、VSTS

Visual Studio解决方案(.Sln)和Wise安装脚本(.Wse)的命令行编译

CollectionEditor 显示 [说明] 区域
18、SQLServer

Sqlserver2008数据引擎特性之空间数据预先体验

数据挖掘初探-用简单公式预测下月数据

使用Transact-SQL进行数据导入导出方法详解

发现一个SQLSERVER数据库的编绎解析问题

MSSQL 2005 分页分析及优化

Access数据库的文本、备注数据类型的COLUMN_FLAGS说明

使用Oracle Generic Connectivity连接SqlServer

[原创]SQL Server 2005 镜像构建手册

sql取所有记录中每天的最后一笔交易的记录

MySQL查询的性能优化

SQL Server2005探索之—— 利用SQL Server2005提供的namespace 编程

Report Definition Language(RDL) 轻型框架实现

无限级别的分类

sql server2005对t-sql的增强之在聚合函数的后面使用over关键字
19、软件工程(项目管理、项目流程分析、单元测试、需求分析、敏捷开发、SOA、UML)

Agile Software Development(敏捷软件开发)

慈善跟踪项目

该封装到什么程度?

Saas安全性问题讨论

自己动手写个ORM 实现(1)

我写项目的步骤。抛砖引玉。

自己动手写个ORM实现(2)

你是否积极主动(Proactivity)?

查询的条件和需要什么样的结果如何通知后台服务类的问题

项目经理虚拟管理客户

研发过程管理导图-第一稿 第二稿

EA(Enterprise Architect)

实战剖析三层架构
20、Web Service
21、WinForm(多线程、同步异步、序列化、反射、Remoting)

C# 实现屏幕键盘 (ScreenKeyboard)

通过编程管理windows 防火墙

C#(Win)Button实现下拉菜单

C#发现之旅第四讲 Windows图形开发入门 5 6

开发基于UDP广播的小型局域网聊天室

ASP.NET中使用反射将控件值与实体值相互映射

[趣味编程]CPU占用率曲线听我指挥

白话并发冲突与线程同步(1)
22、.NET、CLR

(纪念国殇).Net Hosting:托管远程线程插入及非托管dll线程插入实现

.NET 上下文拦截(2)

你知道 typeof(void) 吗?

靠近IL用DynamicMethod简单实现方法

Microsoft Sync Framework 系列(五):微软同步框架中的元数据(Metadata)

如何序列化Control等复杂类型对象
23、C#(2.0,、3.0)

委托 - 事件 - 内存泄漏 - 弱引用 让人欢喜让人"忧"

C# 3.0 扩展方法 实践

能自己“跑”的表单控件,思路,雏形,源码。vs2005版本

比较C#中的readonly与const
24、组件开发

Web基础控件开发--属性 [类型转换]

Attribute应用,简化ANF自定义控件初始化过程

扩展 CheckBoxField 类别 - 支持非布尔值的双向系结

扩展 GridView 控件 - 无数据时显示标题列

Asp.NET大文件上传组件开发总结(五)---上传进度信息的显示

以横向树方式显示Html表格》合适?

[系列文章]上传文件管理控件之v1 v2

扩展 CheckBoxList 控件 - 系结复选项目 2

asp.net 控件开发(三)------处理标签间内容

表单控件续(1)——应用接口来简化和分散代码

[系列文章]上传文件管理控件v3

表单控件的副产品——查询控件

GridView 自动编号字段 - TBSerialNumberField
25、开源项目

基于Mozilla Thunderbird的扩展开发(五)---进程间通信之Socket篇(上) 6 7 8

开源Granados介绍 - SSH连接远程Linux服务器(C#)

【PE】流程图对象以及事件驱动机制的介绍

DNN模块开发之利器篇:七种武器

Gallio 自动化测试平台

Unity(七):使用场景Ⅲ:用于依赖注入(下)

ABAP学习-第一章[开发环境和总体介绍] 2

DataRabbit 轻量的ORM框架(16)-- Entity缓存

在RedHat Enterprise 4 上安装 Mono1.9 (四)

26、算法数据结构

关于阶乘的两个常见算法及一个相关面试题

C#与数据结构--二叉树的遍历

表達式解析運算器(二)-- 算法實現

KTDictSeg 分词组件1.3版本 部分算法讨论 -- 分词粒度

KTDictSeg 分词组件1.3版本 部分算法讨论 -- 中文姓名识别和未登录词识别

27、Office开发

.Net 中处理Word(2007)文档的一种方法

通过代码解压出InfoPath模板文件xsn中的文件

[原]OWC做电子表格和图表的试验

Hello, Biztalk 2006 R2 BAM

C#进行Visio二次开发之鸡毛蒜皮(一)

28、Windows Mobile平台等嵌入式平台开发

灾难环境下的Mobile应用构建及部署

 

:有些分类我也觉得有些委屈求全,具体分类会在对大家的文章更多地全面的分析后再分。当前分类请参考《博客园精华集》技术分类目录草案。真的很抱歉,看来文章种类真的很繁多,咂看上去这文章分类是很齐全了,但真正到用来分类的时候却发现有很多不足之处。希望各位网友和编委会成员都加以重视分类的问题。

 

posted @ 2008-05-20 00:57 volnet(可以叫我大V) 阅读(147) | 评论 (2)编辑

【号召博客园网友以及所有爱心人士向四川汶川等重灾区捐款捐物】

     摘要:   阅读全文

posted @ 2008-05-13 03:11 volnet(可以叫我大V) 阅读(2096) | 评论 (28)编辑

动态加载控件_常见问题解决之道

     摘要: 动态加载控件貌似给很多程序员都带来了困扰,经常收到这样的邮件,干脆就写下面这个示例来演示如何解决那些常见的问题吧。其实常见的问题通常有这样两个:1、通常他们都通过一个按钮来添加一个UserControl并将它们加入PlaceHolder容器的Controls中。然后页面上就会有一个另外一个按钮,这个按钮什么相关的事也没做,就是做了一次回发。这样的情况动态添加的控件就不翼而飞了。 2、今天收到了一封... 阅读全文

posted @ 2008-05-10 06:06 volnet(可以叫我大V) 阅读(3095) | 评论 (17)编辑

【代码保留】WinForm ListBox上下移动选中项(扩展)

     摘要: 一直都在做asp.net的东西,WinForm好久没碰过了,近乎陌生。今天同事说他的Winform中的ListBox无法上下移动项,让我感觉好奇怪,怎么可能,不就是交替选项么,换换位置应该就可以搞定。看了同事的代码,只觉得一片混沌,实在不忍心再读下去,就自己操刀写一下了。(下面的代码使用了扩展方法,需要编译器版本>=3.0,也可以根据相关语法自行修改成2.0以下的版本)代码功能:比较简单,就... 阅读全文

posted @ 2008-05-07 13:46 volnet(可以叫我大V) 阅读(293) | 评论 (0)编辑

看看属性被变异(编译)后的样子……

准备工作

其实没有什么准备工作,不过可以看看《关于打开ILDASM的方法(2种)》,或许对您有用。

 

前言

本来没有这个前言的,刚才自己看了标题,感觉有属性大全的味道,顺便改了标题,很可惜这里不讲那些你需要基础知识,那些知识您可以从MSDN获取。本文究竟讲些什么呢?本文其实没讲什么,就想看看属性被“编译”(变异)后的样子……

 

关于属性

get、set访问器

在使用了get、set访问器后,同类中不能够定义名称为get_[PropertyName]()与set_[PropertyName](TypeOfProperty value)这样的方法,否则将遭遇编译错误,如下图所示:

image

通过ILDASM工具查看后方可知道,get和set访问器会被编译器编译成依照上述规则而转换的公有方法供外部调用,这时我们若定义了相同签名的方法体将导致编译器的编译结果违背最基本的定义规则。

image 

自动实现的属性

众所周知在.NET 3.0的新版本中增加了自动实现的属性(automatically implemented property)语言特性。这将带来形如下面这样的属性声明方式:

        public int DotNet3Field1
        {
            get;
            set;
        }

那么它将如何编译呢?同样用ILDASM查看:

image

在图中我们可以很容易看到它通过了'<PropertyName>k__BackingField'的方式进行了声明。关于自动实现的属性的限制,请参看《自动实现的属性》而这样的方式避免了之前编译错误的尴尬,因为由编译器生成的字段名不符合我们的语言规范。

索引器

为了说明问题以下仅依照索引器的定义规范实现索引器,但不保证索引器能够正常工作:

        public int this[int index]
        {
            get {
                return 0;
            }
            set {
            }
        }

image

仔细对比就可以看见多了

.custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = (01 00 04 49 74 65 6D 00 00)

get_Item : int32(int32)

set_Item : void(int32,int32)

Item : instance int32(int32)

以下分别是get_Item和set_Item的IL代码

.method public hidebysig specialname instance int32 
        get_Item(int32 index) cil managed
{
  // 代码大小       7 (0x7)
  .maxstack  1
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.0
  IL_0003:  br.s       IL_0005
  IL_0005:  ldloc.0
  IL_0006:  ret
} // end of method BaseClass::get_Item

.method public hidebysig specialname instance void 
        set_Item(int32 index,
                 int32 'value') cil managed
{
  // 代码大小       2 (0x2)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ret
} // end of method BaseClass::set_Item
因此其实索引器与属性之间的唯一差别仅在于参数的个数上,当然外部表现还有那个中括号。

posted @ 2008-04-19 16:41 volnet(可以叫我大V) 阅读(244) | 评论 (1)编辑

关于打开ILDASM的方法(2种)

关于打开ILDASM的方法(2种)(推荐方法2):

1、通过VisualStudio在开始菜单下的Microsoft Visual Studio 2008\Visual Studio Tools\中的命令提示符中输入ildasm即可

2、将其添加至Visual Studio的外部工具中。获取它地址的方法简要描述为:先通过方法1启动ildasm,打开任务管理器,在进程中找到ildasm,右键选择调试,用VisualStudio或其他开发工具打开,通过属性可获得该工具的本地磁盘位置。我机器上它存在于C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ILDASM.EXE,若您机器上它不是位于这个位置,按我的方式即可找到它,复制这个地址,并打开VisualStudio,在“工具”中找到“外部工具”,点击“添加”,填写相应信息即可。关于参数一栏可以参考http://msdn2.microsoft.com/zh-cn/library/f7dy01k1(VS.80).aspx中的相关说明。我这里添加了最基本的参数filename,将其添加到参数一栏即可:$(ProjectDir)bin\Debug\$(TargetName)$(TargetExt)

image_thumb[9]

posted @ 2008-04-19 16:18 volnet(可以叫我大V) 阅读(255) | 评论 (0)编辑

【代码保留】IE8中如何添加Activity

     摘要: 试试下面这个功能吧:(选中之后是利用“博客园”的博问搜索进行搜索……) IE8中添加Activity的JavaScript脚本(这是一个来自淘宝网的例子)(本文最后脚本有做修改)<script type="text/javascript"> function addActivity() { if (navigator.userAgent.indexOf('MSIE 8') == -1)... 阅读全文

posted @ 2008-04-08 00:48 volnet(可以叫我大V) 阅读(1411) | 评论 (5)编辑

初试Deep Zoom Composer(Step by Step|More Pictures)(超酷+必试)

10_FinalEffect

今天看到周兄的【全面解析DeepZoom 之一】酷!Deep Zoom的介绍,觉得实在是酷,就开始动手做了一下,做的不好,凑合着看吧。周兄是给大家全面解析,我只是做着玩的,所以叫做简单示范……

准备

1.Visual Studio 2008

2.Deep Zoom Composer(http://blogs.msdn.com/expression/archive/2008/03/05/download-the-preview-of-the-deep-zoom-composer.aspx)

3.Silverlight beta2

4.图片若干

步骤

1.打开Deep Zoom Composer,新建Project,Import图片,图片将如图显示在Deep Zoom Composer的右侧

1_Import

2.点击Compose,然后将右侧的图片摆放到中间的面板上,注意到下方有一些布局工具,大家可以用来做图片对齐,摆放完的图片将如图所示。

2_Compose

3.点击Export,导出图片,给它一个命名,点Export按钮即可。我这里起名为Demo1Export

3_Export

4.打开Visual Studio 2008,新建一个Silverlight项目,选择一个测试项目,我这里选择一个Web Application Project作为测试项目。

4_SilverlightProject

5.我们之前用Deep Zoom Composer导出的文件的文件夹内有个source images\OutputSdi的文件夹,将它Copy到我们用VS创建的Web项目的ClientBin文件夹下(可能需要先编译一次Web项目,注意不是Sliverlight项目,而是它的测试工程中)

5_ClientBin 6_OutputSdi

6.导入文件后的项目如下所示。注意ClientBin文件夹。

7_Solution

7.点击Page.xaml,修改代码如下:

<UserControl x:Class="SA_DeepZoomComposerDemo1.Page"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid
    x:Name="LayoutRoot"
    Background="AliceBlue">

        <MultiScaleImage
              x:Name="msi"
              ViewportWidth="1.0"
              Source="/demo1export/info.bin" MouseLeftButtonDown="msi_MouseLeftButtonDown" MouseLeftButtonUp="msi_MouseLeftButtonUp" MouseMove="msi_MouseMove"/>
       </Grid>
</UserControl>

这里因为我暂时没研究出怎么控制鼠标滚轮,所以没法做出那种滚动的效果(时间太迟了,不想去找了)……注意MultiScaleImage节点下的相关设置。我用于取代鼠标滚轮的做法是使用一个按钮来激活是否放大缩小。代码有点生硬,大家自己改造……

运行效果:

8_StaticEffect

试着将ViewportWidth修改为2.0,再次运行,效果将变为:

9_ChangeViewportWidth

8.点击Page.xmal.cs文件,修改代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
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;

namespace SA_DeepZoomComposerDemo1
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            new MouseWheelHelper(msi).Moved += new EventHandler<MouseWheelEventArgs>(msi_Scroll);
        }

        Mouse _m = new Mouse();

        private void msi_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _m.DownPosition = e.GetPosition(msi);
        }

        private void msi_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _m.UpPosition = e.GetPosition(msi);
            msi.ViewportOrigin = new Point(msi.ViewportOrigin.X + _m.UpInterval.X, msi.ViewportOrigin.Y + _m.UpInterval.Y);
        }

        private void msi_MouseMove(object sender, MouseEventArgs e)
        {
            _m.MovePosition = e.GetPosition(msi);
        }

        private void msi_Scroll(object sender, MouseWheelEventArgs e)
        {
            Point p = GetCenter();
            if (e.Delta > 0)
            {
                msi.ZoomAboutLogicalPoint(1.1, p.X, p.Y);
            }
            else
            {
                msi.ZoomAboutLogicalPoint(0.9, p.X, p.Y);
            }
        }

        private Point GetCenter()
        {
            double centreX = msi.Width / 2;
            double centreY = (msi.Width / msi.AspectRatio) / 2; //
            return msi.ElementToLogicalPoint(new Point(centreX, centreY));
        }
    }
}

值得注意的是ZoomAboutLogicalPoint方法(试一下吧,试了你就知道……)

这里用到了MouseWheelHelper类,大家可以从http://blois.us/Silverlight/Scrolling2/MouseWheelHelper.cs下载,并添加到项目中,具体用法我就不再赘述了……

9.另外需要你添加一个Mouse类,

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SA_DeepZoomComposerDemo1
{
    public class Mouse
    {
        public Point DownPosition
        {
            get;
            set;
        }
        public Point UpPosition
        {
            get;
            set;
        }
        public Point MovePosition
        {
            get;
            set;
        }
        public Point UpInterval
        {
            get
            {
                return new Point((DownPosition.X - UpPosition.X) / 1000, (DownPosition.Y - UpPosition.Y) / 1000);
            }
        }
    }
}

10.运行程序,得到下面的效果:

10_FinalEffect

总结

有许多需要修改的地方,不过通过这个简单的示例你应该知道http://memorabilia.hardrock.com/的效果并不至于难道哪里去,Deep Zoom Composer为我们封装的API太强大了,让我们不需要花费多少体力就可以做出很酷的效果了。还犹豫什么?快点开始用Silverlight2吧……

PS

因为包括了大量的图片,所以没法打包上传了,有需要Source Code的同志留下邮箱吧(放一个无图片版本的给大家下载添加图片请参考步骤1到5。),我会尽快发送的……

posted @ 2008-04-07 04:05 volnet(可以叫我大V) 阅读(2291) | 评论 (15)编辑

应用程序的重定向

     摘要: 今天有一个网友通过“发送短消息”向我提了一个题为《关于“C#重定向问题”的探讨》问题。本着对网友的负责,我决定写下完整示例。关于网友所提的问题,因为描述的信息不够充足,我很难告知具体是哪里出了问题,直觉判断是masm.exe中的程序可能有点问题,但也不排除其他可能。希望能够提供更多的信息进行排错。既然我写下了示例,而且自己也不曾做过相关的内容,就博留... 阅读全文

posted @ 2008-04-04 02:03 volnet(可以叫我大V) 阅读(1569) | 评论 (4)编辑

[代码保留]ORA-01033: ORACLE initialization or shutdown in progress

错误编码:ORA-01033: ORACLE initialization or shutdown in progress

故障描述:因为移动了数据库文件([NAME].DMP)/日志文件等文件,导致数据库连接出现ORA-01033错误。

故障分析:[观点来自网络本人并不保证其正确性]网上有一种常见的说法是该类故障通常是由于移动文件而影响了数据库日志文件出现损坏而导致的无法正常进行IO操作而引起的错误。ORACLE将识别为数据库未装载完成而导致出现如上错误。

故障特征:使用命令行sqlplus或PL/SQL Developer均无法打开数据库。但是可以使用sys用户以sysdba的身份登录系统。

问题解决

1.网络上常见的多是针对数据恢复方面的一些解答。在数据恢复方面肯定不能保证100%成功完成。这可能涉及到你对备份机制的一些配置。网上常见的方法请使用Google搜索引擎进行检索。在本例中,网上的大部分方法都无功而返,因此我无法验证网上的方法是否正确。请尝试解决。

2.官方针对ORA-01033的解释基本上是让用户等待一段时间后再次登陆,基于这种判断在于ORA-01033的本质是由于未完全加载而导致的进程忙碌所造成的,这种情况的合理解释确实可以是让用户等待到加载完毕。但是对于此种文件损坏的不可逆的操作,也就代表着永远不可能等到加载完毕的那一刻,因此,用等待并不一定能解决。

3.[危险性]提及危险性的目的在于这通常不适用于正式数据库的操作,原因在于这种操作是数据破坏性的和不可逆的。基本思路就是将数据库从oracle中剥离出去而不使用备份的数据进行恢复。对于大量重要数据的表,建议寻求更专业的帮助。不过对于临时数据或者误操作所带来的无关数据的删除还是很见效的。

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\GongCen>sqlplus / as sysdba

SQL*Plus: Release 10.1.0.2.0 - Production on 星期一 3月 31 14:19:39 2008

Copyright (c) 1982, 2004, Oracle.  All rights reserved.

连接到:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production With the Partitioning, OLAP and Data Mining options

SQL> alter database datafile 'C:\Documents and Settings\GongCen\My Documents\Visual Studio 2008\VSS Projects\lpgl\Code\sql\lpgl' offline drop;

数据库已更改。

SQL> shutdown immediate
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  171966464 bytes
Fixed Size                   787988 bytes
Variable Size             145488364 bytes
Database Buffers           25165824 bytes
Redo Buffers                 524288 bytes
数据库装载完毕。
数据库已经打开。

由于仅删除了数据库文件,并未对其中关系进行维护,因此需要手动将该数据库实例的用户进行删除操作,您可以通过命令行也可以使用可视化工具进行操作。删除用户操作需要您具备sysdba或同等类型权限。

posted @ 2008-04-01 01:49 volnet(可以叫我大V) 阅读(823) | 评论 (0)编辑

JavaScript:指飘器~(有点“象形名字”的味道,鼠标“指”上去,就“飘”起来了)BTW:顺便帮帮我……有点小麻烦……

     摘要: 超多惊喜更多期待等你拿!   阅读全文

posted @ 2008-03-29 04:09 volnet(可以叫我大V) 阅读(2613) | 评论 (12)编辑

[翻译]调试技巧(Debug Tips)

原文链接:http://msdn2.microsoft.com/en-us/library/aa767915(VS.85).aspx

文章提供了一些可插协议(pluggable protocols)处理异常和理解生成的HRESULT错误码的技巧。

 

处理异常

首先说说Windows Internet Explorer7,Urlmon.dll将安静地处理这些由可插协议引起的异常。开发者在这种配置下需要使用调试工具在异常通过Urlmon.dll的时候试着调试这些自定义处理器。

IE7所带的Urlmon.dll版本将不再处理异常。开发者必须在可插协议中自行实现一个全局的异常处理程序。

 

错误代码

一些函数和方法返回非标准的HRESULT值,就像IInternetSecurityManager::SetZoneMapping。许多这些返回值是由宏生成的,它们设置低位为有效的Microsoft Win32错误码将高位设置为8007。

posted @ 2008-03-28 01:53 volnet(可以叫我大V) 阅读(169) | 评论 (0)编辑

[翻译]关于“异步可插协议”(About Asynchronous Pluggable Protocols(APPs))

     摘要: 原文链接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx 异步可插协议允许开发者创建可插协议处理器,MIME过滤器,以及命名空间处理器工作在微软IE4.0浏览器以及更高版本或者URL moniker中。这篇文章涵盖了Urlmon.dll动态链接库所公开(输出)的可插协议诸多功能。关于Urlmon.dll针对其他APIs所公... 阅读全文

posted @ 2008-03-28 01:24 volnet(可以叫我大V) 阅读(369) | 评论 (0)编辑

[翻译]注册协议(Register Protocol)

原文链接http://kb.mozillazine.org/Register_protocol

协议是一个用来通过连接来发送、接收和处理信息的方法。普通常见的浏览器协议包括http、https、ftp和mailto。为了你能够发送一个指定的协议来查看信息,你必须注册它们。如果你输入一个未知协议(如foo)的URL在你的定位符工具栏中,你将接收到一个这样的消息:“FireFox不知道如何打开这个地址,因为协议(foo)并不关联于任何程序或者在Mozilla Suite/SeaMonkey中,foo不是一个已经注册的协议”。(译注1)

一旦注册,协议就可以用你指定的程序进行处理,就像你的浏览器或者第三方的阅读器。这意味着一个超级链接(例如:foo://fred)可以使用协议foo来打开文件fred。(译注2)

内容:(以下链接指向原文)

[hide]

 

Windows

在Windows中,协议注册时写入操作系统的。例如,当你设置一个网页浏览器为默认浏览器,操作系统将注册http、https和ftp协议并且将它们关联到这个网页浏览器;当你在邮件消息或者一个互联网快捷方式中打开http、https和ftp链接的时候,这个URL将通过这个网页浏览器来打开。相似的,当你设置默认的邮件客户端,操作系统将注册mailto协议,以至于在浏览器中打开mailto链接的时候会打开这个关联的邮件应用程序。

注意: Mozilla Suite/SeaMonkey integrates mail and browser functions以至于一个邮件消息的网页链接(例如:http://链接)将在SeaMonkey浏览器窗体中打开,“mailto:”链接将在SeaMonkey Mail中打开,而不管操作系统中协议处理器的相关设置。

其他协议可以通过配置一个安装的程序被注册为关联到一个外部应用程序来处理相关内容。例如:你可以通过RealPlayer的“偏好”->“内容”->“媒体类型”设置为RTSP URLs注册相关的处理器为RealPlayer(Real-Time Streaming Protocol)。接下来当你再次打开rtsp://链接的时候,Firefox或者Mozilla Suite/SeaMonkey将在应用程序启动前询问你是否确定这个外部的协议请求。(译注3)

同样也可以通过创建一个像下面这样的.reg文件来注册协议,将它们改成文件:

REGEDIT4

[HKEY_CLASSES_ROOT\foo]
@="URL:foo Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\foo\shell]

[HKEY_CLASSES_ROOT\foo\shell\open]

[HKEY_CLASSES_ROOT\foo\shell\open\command]
@="\"C:\\Program Files\\Application\\program.exe\" \"%1\"" 
将foo替换为你指定的希望运行的程序C:\\Program Files\\Application\\program.exe。
注意:两个反斜干(\\)以及转义的引号(\")不应该被替换(必须的)。保存文件,然后双击它们以让他们插入Windows注册表。看看附加信息《Registering an Application to a URL Protocol
 
Linux和Mac

输入about:config到地址栏并敲入回车。

右键->新建->布尔->名字:网络.协议.处理器.外部.foo->值->true(用你指定的协议还原foo)

(英文版)Right-click -> New -> Boolean -> Name: network.protocol-handler.external.foo -> Value -> true (Replacing foo with the protocol you're specifying)

右键->新建->字符->名字:网络.协议.处理器.应用.foo->值->/path/to/app(用你指定的协议还原foo,并且path/to/app部分用你希望执行的应用程序路径来替换)

(英文版)Right-click -> New -> String -> Name: network.protocol-handler.app.foo -> Value -> /path/to/app (Replacing foo with the protocol you're specifying and /path/to/app with the path to the application you want to run.

确保network.protocol-handler.expose-all设置为true。(译注4)

 

解决纷争

(Linux和Mac)如果设置偏好的时候路径或者名字不正确,FireFox将显示错误为:“协议(foo)没有与任何程序关联。”(bug 312953)

如果你在Firefox使用mailto协议没有关联任何程序,请重新设置你的默认邮件客户端(default mail client.)。

默认情况下不安全的协议将被忽略(bug 173010).

 

关联

 

外部链接

The protocol is not associated with any program (Firefox Support)

 

译注

1.因为原文发布于mozillzaine,所以其以firefox为示例。

2.事实上,不是打开名为fred的文件。

3.默认安全设置下的Internet Explorer将不会询问,而Firefox将会询问。

4.如图所示

UrlProtocolFireFoxNetworkProtocol-HandlerExpose-All

posted @ 2008-03-26 20:43 volnet(可以叫我大V) 阅读(1096) | 评论 (0)编辑

[翻译]将应用程序注册为URL协议(Registering an Application to a URL Protocol)

原文链接:Registering an Application to a URL Protocol(http://msdn2.microsoft.com/en-us/library/aa767914.aspx

文章《About Asynchronous Pluggable Protocols》(中译[翻译]关于“异步可插协议”(About Asynchronous Pluggable Protocols(APPs)))描述了如何为一个新的协议开发处理程序(处理器handlers)。在一些案例中,可能会描述如何调用另外一个应用程序来处理自定义协议(custom protocol)。注册已经存在的应用程序为一个URL协议处理器即可。一旦应用程序被成功地启动,我们可以使用命令行参数来重新找回URL来启动它。

  • 注册应用程序来处理自定义协议
  • 启动处理程序
  • 示例
  • 相关主题

注册应用程序来处理自定义协议

你必须添加一个新的key以及相关的value到HKEY_CLASSES_ROOT中,来使应用程序可以处理特殊的URL协议。

新注册的key必须与协议scheme相匹配才可以被添加。例如,增加一个“alert:”协议,被增加到HKEY_CLASSES_ROOT的key必须是alert。在这个新的key之下,默认的字符串value将显示新协议的名字,并且URL协议字符串value将包含协议特有的信息或者空字符串。Keys将同样被添加到DefaultIconshell中。

默认的DefaultIcon key的字符串value必须是新URL协议图标文件名的路径。(译注1:DefaultIcon key

shell key之下,一个key使用一个动词(就像open)将被添加。一个command(命令) key和一个DDEEXEC(动态数据交换执行) key都是使用动词来添加的。这command和DDEEXEC keys之后的values都是用来调用(或者启动)处理新协议的应用程序。

 

启动处理程序

当一个用户点击一个注册了你的自定义URL协议的链接后,Windows Internet Explorer(IE)启动注册的URL协议的处理器。如果指定shellopen命令在注册表中包含一个%1参数的话,Internet Explorer传递这个URI给注册协议的处理器。这最后的统一资源标识符(URI)被编码(%1);即16进制换码符被转换为等价的UTF-16字符。例如,用%20字符串取代空格。

安全警示:应用程序处理URL协议必须全力面对恶意数据。因为处理程序接收来自不信任源的数据,URL和其它参数值传递给应用程序可能包含的恶意数据企图使用处理程序。因此,处理程序可以首先启动基于外部数据的空闲行为确认这些行为以及它们的用户。

注意:另外,处理程序将要有能力处理URLs有可能太长或者包含意想不到(或者多余的)字符串。更多信息,请参看《Writing Secure Code

 

示例

接下来的例子演示如何注册alert.exe应用程序,来处理alert协议。

HKEY_CLASSES_ROOT
	alert
	(Default) = "URL:Alert Protocol"
	URL Protocol = ""
	DefaultIcon
		(Default) = "alert.exe"
	shell
		open
			command
				(Default) = "C:\Program Files\Alert\alert.exe" "%1"
增加这些设置信息到注册表,尝试导航到像“alert:Hello%20World”这样的URLs中,将会尝试启动alert.exe程序并且在命令行中传递“Hello World”

下面的代码包含了一个简单的C#控制台应用程序演示了一种实现alert协议处理程序的方式。

using System;
using System.Collections.Generic;
using System.Text;

namespace Alert1
{
  class Program
  {
    static string ProcessInput(string s)
    {
       // TODO Verify and validate the input 
       // string as appropriate for your application.
       // return s;
    }

    static void Main(string[] args)
    {
      Console.WriteLine("Alert.exe invoked with the following parameters.\r\n");
      Console.WriteLine("Raw command-line: \n\t" + Environment.CommandLine);

      Console.WriteLine("\n\nArguments:\n");
      foreach (string s in args)
      {
        Console.WriteLine("\t" + ProcessInput(s));
      }
      Console.WriteLine("\nPress any key to continue...");
      Console.ReadKey();
    }
  }
}
 

相关主题

  • About Asynchronous Pluggable Protocols
  • Debugging Tips

     

    译注

    2.详细步骤:

    1. 编写如上所示的控制台程序,并记录下exe所在的全路径;
    2. 开始->运行->输入“REGEDIT”确定,以启动“注册表编辑器”;
    3. 找到(通常是第一个)HKEY_CLASSES_ROOT节点,右键新建项,输入你期望的协议名,如GoCool;
    4. 同样方式建立如下所示层级结构:
      UrlProtocol
    5. 在浏览器执行:
      UrlProtocolResult

    值得注意的是参数会默认以“,”开始,不过没关系,能够得到所有的URL字符串,对我们来说,其他内容也就是一些老调重弹了。这个“,”就是在设置command中的那个"……","%1"中的这个逗号。也可以用“C:\GoCoolCenter\MyCSharpProject\ConsoleApplication\CA_RegisteringHandlingCustomProtocol\CA_RegisteringHandlingCustomProtocol\bin\Debug\CA_RegisteringHandlingCustomProtocol.exe "%1"”的语句来代替之前的语句。去掉“"%1"”两边的引号,之后的参数将以空格进行分隔输出。

  • posted @ 2008-03-26 19:11 volnet(可以叫我大V) 阅读(1323) | 评论 (6)编辑

    如何使用ASP.NET2.0的“嵌入的资源”

    关于嵌入的资源在MSDN已经有一些基本的介绍:“嵌入的资源”(ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_csexpresscon/html/f42dff1c-6804-4fda-94e5-1e77460a9142.htm)

    这里我们要介绍的内容将让这些资源变得更加简洁。

    通常我们在ASP.NET2.0中使用嵌入的资源的时候只需完成以下几步:

    1.添加资源文件,如:

    resource

    2.将资源文件的编译方式变为“嵌入的资源”,如:

    embededResource

    3.添加Assembly信息(AssemblyInfo.CS或者在具体类的namespace之上),如:

    [assembly: System.Web.UI.WebResource("IntelligenceTextBox.JScript.IntelligenceTextBox.js", "application/x-javascript")]
    [assembly: System.Web.UI.WebResource("IntelligenceTextBox.CSS.IntelligenceTextBoxStylesheet.css", "text/css")]

    4.将资源文件注册到页面文件中(在protected override void OnPreRender(System.EventArgs e)里),如:

    Page.ClientScript.RegisterClientScriptResource(this.GetType(), "IntelligenceTextBox.JScript.IntelligenceTextBox.js");

    完成这一步后的脚本文件就会在PreRender的时候输出到前台Html中。如:

    <script src="/WebResource.axd?d=XBIPl09lmgYKinSg7vem6zAjPh9zda0B5YvbMz9cdk-Dtoq3pnz_VUoa1-xOFpiq0&amp;t=633419848307656250" type="text/javascript"></script>
    
    这样就可以在页面文件中引用相关的资源文件中的内容了。
    但是我们注意到RegisterClientScriptResource在生成的时候都会当作application/x-javascript来输出,因此最终都只能得到type="text/javascript",而这样的设置则不符合其他类型资源的输入规则。为此我构建了下面这个类,仅完成了MetaType类型为text/css的资源的输出,但它很容易扩充成支持各种格式的类型,而扩充需要您做的事很少。引入资源的方式却十分简单。
    思路:
    添加资源到页面,无非就是做到如上所示的1到4点,而唯一要解决的就是不同的metaType所特定的格式不同,如:
    CSS:
    <link href="{0}" rel="stylesheet" type="text/css"/>
    JavaScript:
    <script src="{0}" type="text/javascript"></script>
    而我们的期待的表现形式则形如上文第4点所示的方式,另外需要解决的一个问题是一个页面多个资源不用重复注册的问题。
    是否添加重复资源的问题应该留给用户自行解决,因此通过提供IsResourceRegistered方法给用户进行自行判断。
    [下面的代码需要经过改造后才能通过.NET2.0编译器的编译,否则默认使用.NET3.0以上编译器可以编译,请见谅!]
    调用代