2009年2月13日

其实网上有挺多实现鼠标滚轮支持的文章,原理都一样,通过 HtmlPage.Window.AttachEvent("DOMMouseScroll", ...)来对ScrollViewer进行控制,但许多却仅限于对ScrollViewer添加滚轮支持,而对TextBox、ListBox这样的控件 好像挺没辙的。

使用Reflector看TextBox和ListBox的实现,发现他们内部都有一个field为ScrollViewer,只要读到这个 field,应该就能对它们的滚动进行控制。我尝试使用反射获取它们的ScrollViewer,但Silverlight的安全机制和完全版的CLR不 同,它不允许我获得非public的成员。。。

突然...从Reflector看到TextBox和ListBox都使用了父类的GetTemplateChild方法获取 ScrollViewer对象,而GetTemplateChild是protected方法,所以只需要创建一个类,继承TextBox或者 ListBox,再使用GetTemplateChild来暴露他们的ScrollViewer!

namespace Xin.Silverlight.MouseWheelSupport
{
    
public class ListBox : System.Windows.Controls.ListBox, IScrollable
    {
        ScrollViewer sw;

        
public ScrollViewer ScrollViewer
        {
            
get
            {
                
if (sw == null)
                {
                    sw 
= GetTemplateChild("ScrollViewer"as ScrollViewer;
                }
                
return sw;
            }
        }
    }
}

 代码中的IScrollable是自己写的一个小接口,声明实现它的类必须拥有一个ScrollViewer property。示例代码中只对TextBox和ListBox实现了该接口,假设需要对GridView等控件添加滚轮支持,只需实现这个接口并暴露 出它的ScrollViewer对象。

 稍稍整理了一下代码,只需要执行MouseWheelSupportAddOn.Activate(this.LayoutRoot, true)便可以对整个Page的可支持滚轮的控件添加滚轮支持。

Activate方法可以接受ContentControl,Panel,IScrollable对象,第二个参数指定是否需要对控件的Children添加滚轮支持。

 

【代码和示例程序下载】

posted @ 2009-02-13 10:54 Adrian H. 阅读(945) 评论(4) 编辑

2008年2月16日

MSDN博客中的一篇文章提到了.NET 3.5 SP1会带来的处个修正,见以下代码:

var floats = new ArrayList { 2.5f, 3.5f, 4.5f };
var ints = from int i in floats select i;

注意from后面声明的显式类型(int)。开发者会很自然地认为ints为[2,3,4],但在现在版本.NET 3.5环境下得到的却是[2,4,4]。

原来那段LINQ表达式将会被编译为以下方法调用:

var ints = floats.Cast<int>().Select<int,int>(i => i);

问题便出现在Cast这个扩展方法中,而Cast内部是通过调用Convert类的ToInt32方法转换ArrayList中元素类型的,而这个方法既不是对浮点数进行截去小数,也不是简单的round: ToInt32方法的文档中是这样描述返回值的:

value rounded to the nearest 32-bit signed integer. If value is halfway between two whole numbers, the even number is returned; that is, 4.5 is converted to 4, and 5.5 is converted to 6.

这种数值转换的方式被称为Banker's rounding

这是个程序语义的问题,将在以后的.NET Frameworkk 3.5 SP1中解决,估计只是修改Cast方法的实现。现在的应对方法是在一些应用场景中不使用显式范围变量。

posted @ 2008-02-16 23:07 Adrian H. 阅读(683) 评论(0) 编辑

2008年2月14日

结合jQuery写了一个类似Web Portal的窗体控制页面(Demo),以前也用过Prototype等JavaScript library,发现jQuery不仅轻量,更是有自己的独特之处,足以满足自己的开发需求了~用jQuery我可以忽略很多basic的问题,比如浏览器兼容性。真是能让人体会到JavaScript的强大了。

看这个Web Portal Demo的源码就可能发现我有滥用closure的嫌疑,JavaScript的closure等动态特性简化了思维,抛开class,解决问题是那么直接~

posted @ 2008-02-14 20:13 Adrian H. 阅读(1228) 评论(0) 编辑

2008年2月12日

原文: Download All the .NET Reference Source Code at Once with Net Mass Downloader
这篇文章介绍了如何使用Net Mass Downloader批量下载.NET源代码和pdb文件,如何配置VS2005以支持使用.NET源代码进行调试。


End of post

posted @ 2008-02-12 21:59 Adrian H. 阅读(1464) 评论(0) 编辑

2008年2月10日

(又是初体验?)

Server Core的理念挺好的,极度减少预装的特性,减小被攻击外表以提高稳定性和效率,可自定义服务器角色和特性。

我的三年前买的本,从安装到登录用了30分钟(典型的Server Core安装时间为15分钟)。
硬盘占用为1.5G。



登录后只有一个命令行,传说中的"没有图形界面(GUI)",其实只是没有Explorer.exe这个Shell而已,GDI是不会跑出这个版本的 Windows内核的。Virtual Machine Addition安装失败,可能是因为没有对应Windows版本的安装包。
Task Manager里多了个Service标签页。
About中显示的版本:Build 6001: Service Pack 1,据消息称跟这和Vista SP1的版本号相同。Server 2008与Vista SP1是相同的版本的核心组件,这可以理解,但显示给用户看会不会很奇怪呢:"RTM的版本就已经SP1了"。
Create New Task对话框中的Browse按钮点击竟然无反应,看来在Server Core安装中是无法看到"文件夹图标"了,既然没有Shell这个按钮无效,为什么还要保留呢?灰的也可以理解啊。

于是我尝试安装一些Feature,使用ocsetup。。
本以为完全安装完IIS7会有一个可视化的管理界面,上网搜索后发现那是不会有的。。
安装GUI Shell界面到Server Core必定不是很简单的事情,我甚至没有找到一篇相关的文章。 我便想念GUI界面了,命令行对专家来说效率的确可以比GUI高,但GUI也并不是那么邪恶吧,有个选择多好呢(Server Core with GUI)?

Server Core对我来说没什么意义了,回北京买了新本后装个Full installation吧~

 

Original post: http://x-dev.cn/post/Windows-Server-2008-Server-Core-Exp.aspx

posted @ 2008-02-10 16:05 Adrian H. 阅读(2881) 评论(4) 编辑