zoukankan      html  css  js  c++  java
  • 为Silverlight控件添加鼠标滚轮支持

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

     

    【代码和示例程序下载】
  • 相关阅读:
    Python学习第42天(ftp习题实现day4)
    Python学习第41天(ftp习题实现day3)
    Python学习第40天(ftp习题实现day2)
    Python学习第39天(ftp习题实现day1)
    Python学习第38天(文件处理,os、sys、pickle模块复习)
    Python学习第37天(socketserver继承原理、通讯加密)
    Python学习第36天(socketserver模块导入)
    Python学习第35天(粘包)
    个人读书笔记04—业务用例图
    命令模式
  • 原文地址:https://www.cnblogs.com/Dah/p/1389792.html
Copyright © 2011-2022 走看看