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

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Check Point Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Secure Thoughts
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Blog of Author Tim Ferriss
B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
T
The Exploit Database - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
AWS News Blog
AWS News Blog
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
T
Troy Hunt's Blog
I
InfoQ
L
LINUX DO - 热门话题
WordPress大学
WordPress大学
C
Cisco Blogs
G
GRAHAM CLULEY
The Register - Security
The Register - Security
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Schneier on Security
Schneier on Security
Project Zero
Project Zero
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
H
Hacker News: Front Page
小众软件
小众软件
雷峰网
雷峰网
The Hacker News
The Hacker News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Tor Project blog
博客园 - 聂微东
N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
The GitHub Blog
The GitHub Blog
腾讯CDC
P
Palo Alto Networks Blog
Scott Helme
Scott Helme

博客园 - HotSky

Chrome启用CDP(chrome-devtools-protocol)进行远程操控 WPF 让ScrollViewer支持鼠标中键滚动缩放内容 Nodejs使用 nodejs中写sql需要用in时的写法 C#城市最短路径 C#Animation Sqlite PDF附录A: 内容流操作码 WPF FPS类 生命模拟 C# Sql帮助类,可扩展 WPF WriteableBitmap通过GDI+绘制帮助类 Alpha混合 Bmp读写二值图 WPF支持任意快捷键+鼠标组合的绑定类 WPF阻止窗体被系统缩放,使用显示器DPI WPF DataGrid自动增长序号列 C#访问或修改私有类、函数、变量、属性 WPF一个简单的属性编辑控件
WPF 让ScrollViewer支持按住鼠标中键拖拽滚动内容
HotSky · 2026-01-27 · via 博客园 - HotSky
public class ScrollViewerMouseMiddleButtonDragToScrollBehavior : Behavior<UIElement>
{
    ScrollViewer target;
    private Point? _startPoint;
    protected override void OnAttached()
    {
        base.OnAttached();
        target = AssociatedObject as ScrollViewer;
        AssociatedObject.MouseMove += AssociatedObject_MouseMove;
        AssociatedObject.MouseDown += AssociatedObject_MouseDown;
        AssociatedObject.MouseUp += AssociatedObject_MouseUp;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
        AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
        AssociatedObject.MouseUp -= AssociatedObject_MouseUp;
    }
    private void AssociatedObject_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton == MouseButtonState.Pressed)
        {
            _startPoint = e.GetPosition(AssociatedObject);
            Mouse.OverrideCursor = Cursors.ScrollAll; // 設定鼠標為拖動光標
            Mouse.Capture(AssociatedObject);
        }
    }
    private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
    {
        if (_startPoint.HasValue && e.MiddleButton == MouseButtonState.Pressed)
        {
            Point currentPoint = e.GetPosition(AssociatedObject);
            Vector offset = currentPoint - _startPoint.Value;
            _startPoint = currentPoint;
            target.ScrollToHorizontalOffset(target.HorizontalOffset - offset.X);
            target.ScrollToVerticalOffset(target.VerticalOffset - offset.Y);
        }
    }
    private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton == MouseButtonState.Released)
        {
            _startPoint = null;
            Mouse.OverrideCursor = null; // 恢復為默認光標
            Mouse.Capture(null);
        }
    }
}

使用方法:

Interaction.GetBehaviors(scrollviewer).Add(new ScrollViewerMouseMiddleButtonDragToScrollBehavior());