在Silverlight控件开发中添加鼠标滚轮支持的方法

原创|其它|编辑:郝浩|2009-02-13 15:46:59.000|阅读 2501 次

概述:在Silverlight控件开发中添加鼠标滚轮支持的方法

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  其实网上有挺多实现鼠标滚轮支持的文章,原理都一样,通过 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添加滚轮支持。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:个人博客

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP