惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - kiminozo

UAP如何根据DeviceFamily显示不同的页面 Windows 10 响应式设计和设备友好的开发 Windows Phone Toolkit for WP8 已经出了 经验 C#手动同步的滥用实例 WP7技巧 扩展【共享...】按钮 Bangumi 番組計劃 WP手机客户端发布 WP7进阶技巧 自定义Toast 提示动画效果 WP7自定义控件 TabSwitch控件 模拟Windows phone 开始菜单的瓦片动画 WP7自定义控件 评分控件 WP7应用开发笔记 TiltEffect为控件添加倾斜的触控响应效果 从FLC中学习的设计模式系列-结构型模式(3)-享元模式 WP7应用开发笔记 继承BitmapSource并使用独立存储来缓存远程的图片 用代理类包装异步调用方法实现异步命令 解决log4net在.net 4.0 ClientProfile下无法使用 从FLC中学习的设计模式系列-结构型模式(2)-装饰 从FLC中学习的设计模式系列-结构型模式(1)-适配器 从FLC中学习的设计模式系列-创建型模式(5)-原型 从FLC中学习的设计模式系列-创建型模式(4)-建造者
代码分享 ScrollViewerListener 获取ScrollViewer的位置改变
kiminozo · 2012-06-17 · via 博客园 - kiminozo

WP没有办法直接获取ScrollViewer的位置,但是可以ScrollViewer通过VerticalOffset的绑定监听实现。

下面写了一个ScrollViewerListener 用于给ScrollViewer扩展一个VerticalScrollChanged事件。

思路是这样的:

1 首先给ScrollViewer附加2个属性VerticalOffsetProperty和ListenerProperty.

2 VerticalOffsetProperty是VerticalOffset的复制,但是VerticalOffsetProperty在meta里定义了自己的回调OnVerticalOffsetChanged,

然后利用Binding的特点 将Source 设置成ScrollViewer,使ta的VerticalOffset和ScrollViewerListener引用的VerticalOffsetProperty绑定起来,

这样ScrollViewer的VerticalOffset也会使VerticalOffsetProperty同时改变,并能在OnVerticalOffsetChanged回调里面处理了。

3 ListenerProperty就是ScrollViewerListener本身的引用。

在处理OnVerticalOffsetChanged回调的时候有个问题,就是sender是ScrollViewer怎么取到ScrollViewerListener呢?

通过ListenerProperty就可以把ScrollViewerListener附加给ScrollViewer这样就可以取得ScrollViewerListener的引用了。

也不会因为在静态方法引用了ScrollViewerListener造成GC不能回收(网上有一种在构造函数使用lambda的方法会产生这种问题)

4 最后取回ScrollViewerListener的引用,并引发VerticalScrollChanged事件。功能就完成了。

View Code

/// <summary>
 /// ScrollViewerListener
 /// </summary>
 internal class ScrollViewerListener
 {
 /// <summary>
 /// 附加ScrollViewerListener
 /// </summary>
 public static readonly DependencyProperty ListenerProperty;

 /// <summary>
 /// 附加VerticalOffset
 /// </summary>
 private static readonly DependencyProperty VerticalOffsetProperty;

 static ScrollViewerListener()
 {
 ListenerProperty = DependencyProperty.RegisterAttached("Listener", typeof (ScrollViewerListener),
 typeof (ScrollViewer),
 new PropertyMetadata(default(ScrollViewerListener)));
 VerticalOffsetProperty = DependencyProperty.RegisterAttached("VerticalOffset", typeof (double),
 typeof (ScrollViewer),
 new PropertyMetadata(default(double),
 OnVerticalOffsetChanged));
 }

 /// <summary>
 /// ScrollViewer监听器
 /// </summary>
 /// <param name="scrollViewer">ScrollViewer</param>
 public ScrollViewerListener(ScrollViewer scrollViewer)
 {
 if (scrollViewer == null) return;
 //附加ScrollViewerListener给ScrollViewer
 scrollViewer.SetValue(ListenerProperty, this);
 //附加绑定ScrollViewer.VerticalOffset给VerticalOffsetProperty
 scrollViewer.SetBinding(VerticalOffsetProperty, new Binding("VerticalOffset") { Source = scrollViewer });

 }

 private static void OnVerticalOffsetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
 {
 var scrollViewer = sender as ScrollViewer;
 if (scrollViewer != null && e.OldValue != e.NewValue)
 {
 //从scrollViewer取回ScrollViewerListener
 var listener = scrollViewer.GetValue(ListenerProperty) as ScrollViewerListener;
 if (listener != null)
 {
 listener.OnVerticalScrollChanged();
 }
 }
 }
 /// <summary>
 /// 纵向滚动事件
 /// </summary>
 public event EventHandler VerticalScrollChanged;

 private void OnVerticalScrollChanged()
 {
 var tmp = VerticalScrollChanged;
 if (tmp != null) 
 tmp(this, EventArgs.Empty);
 }
 }