其实网上有挺多实现鼠标滚轮支持的文章,原理都一样,通过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:50 XIN... 阅读(426) 评论(2) 编辑

最近学起了NHibernate。从SVN上把它的代码下下来,跟着文档用NHibernate.Tool.hbm2ddl里的SchemeExport来创建数据库,结果在创建一个标准的小Cat表时抛出异常:“Cannot define PRIMARY KEY constraint on nullable column in table…”。可我已经在hbm里定义了“<column name="CatId" sql-type="char(32)" not-null="true"/>”啊。

经过N次的设断点Debug,终于在ClassIdBinder.cs的223行看到了这么一句代码:

column.IsNullable = columnSchema.notnullSpecified ? columnSchema.notnull : false;

这句代码很明显有问题,翻译成中文大概是:如果scheme里定义了notnull这个属性,那么将IsNullable属性设为notnull属性。

OK,问题似乎找到了,加个!后重新编译执行创建表成功:

column.IsNullable = columnSchema.notnullSpecified ? !columnSchema.notnull : false;

 

后来我又把SF上发布的2.0.1GA的binary下载下来,用Reflector看了一下,也是一样的错误代码。。。

posted @ 2008-11-21 16:22 XIN... 阅读(106) 评论(0) 编辑

本准备在第一个beta出来的时候再装Windows 7的,但实在等不及了,今天回家就赶紧把Windows 7 Build 6801给装上了,安装的过程和Vista/Server 2008差不多,安装过程大概不到20分钟,注意别安装到已有的Windows 分区就可以了。

比较2的是,在安装过程最后的两次重启前都出现了两次类似“正在为第一次使用做准备”的字样。

下面开始上图。

首先是新的启动画面,新加上的“Starting Windows”比Vista无厘头的什么也没有好多了。

image

Windows 7相比原来版本最大的改进在任务栏上,瞄一眼先:

image

“这不是Mac的Dock么……”--粪青的苹果迷又开始“叫嚣”了,但微软的同志们早就在PDC会议中辟了谣,请看Windows 1.0的任务栏:

image

哈,大图标早在我们出生前的Windows就有了。。。凭啥说屏幕下方的大图标就是窃取Mac OS的创意……

Windows 7中的新式任务栏(又名SuperBar)中的X个新特性极度简化了应用程序窗口的切换和管理,例如当鼠标移向Dock……哦不,任务栏~的IE图标上时,和Vista只有一个预览窗口不同,Windows 7中将出现多个预览小窗口,点击某个缩略图即切换至该网页:

image

右下的通知栏也简化了管理操作:把隐藏的QQ小图标拖进通知栏便可以显示它,如果对某些图标或者通知反感,把它往任务栏外一拖就行了。一个字:拖。

image

说的拖,其实任务栏上的大图标也是可以通过拖来调整顺序的。也许Mac的用户这时候又笑了,确实这只是个非常小的操作,但却花费了微软程序员们20多年的时间来思考如何实现。。。

其他的窗口管理增强还有很多,例如晃晃某个窗口就可以将其他窗口最小化什么的,还有一个叫作瞄(Peek)的特性,之前在某个视频上看过,也非常实用,可以将习惯N线程工作的人从Alt+Tab中解脱出来。但现在可以下载到的6801版没有这个特性,非常之遗憾。。。

然后就是Libraries了,简而言之就是可以将不同位置的文件进行归类,即使你有很多的mp3文件分布在C、D、E、F甚至G区,但你却可以在你的Music Library里统一搜索和管理。

image

再然后就是“附件”中X年(X>10)没变样的小工具的升级,其实也就换了个类似Office 2007的皮儿。
画图板:

image

写字板:“用我写论文足矣”。

image

程序员和经济学家的利器:Windows计算器:

image

其实还有无数个小地方的改进,主要是针对用户体验的,所以等Windows 7发布的时候,用户没有感觉可能才是最好的感觉吧。

终于看够了,现在我要做的就是,重启到原来的系统里,删除之。而明年这个时侯正式版应该早已经出来了~~到时候再用吧~

image

posted @ 2008-11-19 21:31 XIN... 阅读(212) 评论(1) 编辑

最近PDC又展示了ASP.NET AJAX 4.0的新特性,于是我又把微软的AJAX拾回来了,为了方便查看这些AJAX类库的代码,我在网上找到了Eilon Lipton写的ASP.NET AJAX JavaScript Class Browser,颇为惊叹这一年多以前的东西依然能使用的同时,我发现它还不是特别好使,于是基于它改了改,增加了一些特性,诸如能浏览各个方法、属性、事件的代码等等,同时把界面做的更加人性化了一些,如图:

image

代码在这里下载。这个小东西完全是静态的(不需要ASP.NET server,不是说JS是静态的。。),丢到浏览器里打开就能用。如果需要浏览其他MS AJAX类库的话,在html里加一个script tag就行了。当然也可以做成可以动态上传JS文件然后动态加载,各位仁兄有空可以自己再改改。。。

源码里用了一堆JS库,但其中用于语法着色的dp.SyntaxHighlighter库对于JS的字符串处理还是有些问题,会将字符串中的单引号换为双引号,我没仔细看应该怎么改它,总之是个known issue吧。

PS: ASP.NET AJAX 4.0中的template实在太好用了~在tag上随便(=_=b随便起来不是人啊)声明几个attribute就成一个Client Control了,载入WebService端的数据不费吹灰之力~赞!

posted @ 2008-11-14 23:41 XIN... 阅读(180) 评论(3) 编辑

Silverlight.FX项目包含了许多针对现有Silverlight类库的扩展,其中非常实用的是可为控件添加Effect和Transition Effect(过渡效果)。使用过Flex开发的一定对这个特性比较熟悉,而现在使用Silverlight.FX同样可以非常简单地实现它们~

Silverlight.FX通过为对象(控件)添加Attached Property来定义效果、过渡效果,甚至连触发效果的事件也可以通过它来定义。下面的一段代码为Image设置了一个简单的效果。

<Image Source="netfxlogo.png" Opacity="0.4" Stretch="None" RenderTransformOrigin="0.5,0.5">

  <fxui:Interaction.Behaviors>

    <!--当鼠标悬浮-->

    <fxui:HoverEffect>

      <!--框架支持组合效果,Composition设置为Parallel以使以下动画效果同时进行-->

      <fxeffects:CompositeEffect Composition="Parallel">

        <fxeffects:Resize ScaleXRatio="1.2" ScaleYRatio="1.2" Duration="0:0:0.7" Easing="ElasticOut"/>

        <fxeffects:Fade FadeOpacity="1.0" Duration="0:0:0.7" Easing="ElasticOut"/>

      </fxeffects:CompositeEffect>

    </fxui:HoverEffect>

  </fxui:Interaction.Behaviors>

  <!--显式为Resize效果设置ScaleTransform-->

  <Image.RenderTransform>

    <ScaleTransform/>

  </Image.RenderTransform>

</Image>

[Demo|下载代码]

这段代码为Image设置两项效果,分别改变大小和透明度。要注意的是,框架底层通过改变ScaleTransform来改变大小,所以需要显式设置RenderTransform属性(其实可以在应用Effect的时候自动为控件设置,但框架作者并没有这么想……)。另外框架内预设了多种Easing效果,可以让一些效果模拟得更加逼真和动感~

Silverlight.FX里还有许多有意思的东东,下一次再介绍Transition Effect以及支持动画布局的TilePanel等控件。

posted @ 2008-10-25 18:29 XIN... 阅读(379) 评论(0) 编辑
posted @ 2008-10-19 11:50 XIN... 阅读(178) 评论(0) 编辑
posted @ 2008-10-17 11:09 XIN... 阅读(132) 评论(0) 编辑
posted @ 2008-10-16 22:30 XIN... 阅读(433) 评论(0) 编辑
posted @ 2008-10-16 13:19 XIN... 阅读(57) 评论(1) 编辑