为Silverlight控件添加鼠标滚轮支持
2009-02-13 10:54
423 查看
其实网上有挺多实现鼠标滚轮支持的文章,原理都一样,通过 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添加滚轮支持。
【代码和示例程序下载】
使用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添加滚轮支持。
【代码和示例程序下载】
相关文章推荐
- 为Silverlight控件添加鼠标滚轮支持的小类
- 为Silverlight控件添加鼠标滚轮支持的小类
- Silverlight中创建自己的Behavior(为Silverlight添加鼠标双击和滚轮支持)
- WPF ItemsControl 控件支持鼠标滚轮滑动
- 让VB应用程序的控件支持鼠标滚轮滚屏
- 轻轻松松为Sliverlight控件或页面添加鼠标滚轮操作
- 鼠标滚轮支持、VB中数据表格类控件的滚轮支持方法
- Silverlight 4 正确设置 ScrollViewer让它更好的支持鼠标滚轮
- 通过扩展Silverlight的控件DataGrid,使其垂直滚动条支持鼠标滑轮 (转)
- Silverlight 4 支持鼠标滚轮事件了
- 通过扩展Silverlight的控件DataGrid,使其垂直滚动条支持鼠标滑轮
- vb6 鼠标滚轮支持 插件
- 用CToolTipCtrl给控件添加鼠标提示
- 为GridView控件的数据行添加鼠标动作
- 如何在.Net下控件不响应鼠标滚轮动作
- [Silverlight]让DataGrid支持滚轮的山寨方法
- 修改greatis form designer使其添加对三方控件的支持
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(6):为网站添加Silverlight支持.zip(6.31 MB)
- 为OLED屏添加GUI支持6:进度条控件
- 怎样使DataGrid支持鼠标滚轮滚动记录