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

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
SegmentFault 最新的问题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Attack and Defense Labs
Attack and Defense Labs
F
Full Disclosure
Vercel News
Vercel News
N
News | PayPal Newsroom
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
H
Heimdal Security Blog
P
Privacy International News Feed
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cisco Blogs
L
Lohrmann on Cybersecurity
D
Docker
Recent Announcements
Recent Announcements
Security Archives - TechRepublic
Security Archives - TechRepublic
人人都是产品经理
人人都是产品经理
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
T
Tailwind CSS Blog
C
Check Point Blog
博客园 - 叶小钗
Google Online Security Blog
Google Online Security Blog
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
S
Secure Thoughts
博客园 - Franky
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
P
Palo Alto Networks Blog
Latest news
Latest news
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
Last Week in AI
Last Week in AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cyberwarzone
Cyberwarzone
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
Hacker News: Ask HN
Hacker News: Ask HN
T
Threatpost
T
Tenable Blog
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学

博客园 - 旻

关于WPF性能 Sysinternals 实用工具:进程 又关注了一下WPF/SL的混淆问题 随手日记 0525 随手日记 0524 客户端类型软件与用户规模表 2D MatrixTransform的原理 随手日记 0510 将数字世界和真实世界结合的视频。MIT牛人。 WPF 的资源 Ideum的100英寸触摸屏支持50个触摸点 微软多点触摸鼠标视频图片荟萃 [转]win7多点触控的十万个为什么 监听所有的依赖属性 搜集几个多点触摸的视频 Public Computer——未来电脑的新分支,多点触摸的新舞台。 限制WPF Text中的输入字符和长度 7.10 WPF 流水账 Tooltip自定义模版后不能显示内容的问题——ControlTemplate的秘密 - 旻 流水账 5.26 Dell XT2被大卸八块
6.4 流水账-拖拽,又见拖拽
· 2009-06-05 · via 博客园 - 旻

Technorati 标签: WPF,DragDrop

通过上一篇的学习,已经可以实现跨窗口的拖拽,而且可以在像explorer那样显示图标。

但是还有两个问题。

1. 并不是所有的窗口都支持以explorer的模式显示图标。

比如当你拖拽一个桌面图标到VS2008的窗口,鼠标显示:

image 或者image

这是由于目标窗口(Target)不支持造成的Win32新的拖拽特性造成的。

怎么解决?

为一个办法就是在“拖”(drag)的时候不使用Win32的图标功能,自己动手丰衣足食。

WPF提供了PreviewGiveFeedback和GiveFeedback事件。

  • UIElement..::.GiveFeedback

  • UIElement..::.PreviewGiveFeedback

  • ContentElement..::.GiveFeedback

  • ContentElement..::.PreviewGiveFeedback

    这个事件在整个拖拽过程中持续发生,用于拖拽的源程序(Source App)可以控制拖拽时的鼠标指针的外观。

    下面的代码是就是在创建一个Popup对象,在鼠标拖动的时候Popup的位置始终在鼠标指针偏右下3个像素的位置。避免Popup窗体挡住鼠标指针,无法实现拖拽操作。

    void myControl_MouseMove(object sender, MouseEventArgs e)
    {  

        dragPreviewRect = new Rectangle();
        dragPreview.Child = dragPreviewRect;
        dragPreview.Height = myControl.Height;
        dragPreview.Width = myControl.Width;
        dragPreviewRect.Fill=new VisualBrush(myControl);

        myControl.PreviewGiveFeedback += new GiveFeedbackEventHandler(myControl_PreviewGiveFeedback);

        DragDrop.DoDragDrop(myControl, DragDropEffects.Copy,data)

        myControl.PreviewGiveFeedback -= new GiveFeedbackEventHandler(myControl_PreviewGiveFeedback);

    }

    Popup dragPreview = new Popup();

    Rectangle dragPreviewRect;

    void myControl_PreviewGiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
                Point p1 = MouseHelper.GetCursorPos();
                p1.Offset(3, 3);

                dragPreview.HorizontalOffset = p1.X;
                dragPreview.VerticalOffset = p1.Y;
                dragPreview.IsOpen = true;
                e.Handled = true;
      }

    第二个问题是:

    2.如何控制Drop后的行为

    我们的程序可以自己接收其他程序的拖拽,但不能让任何程序都接受我的程序的拖放。比如,如果我将我程序中的一个图片拖拽到窗口外面,窗口外可能是桌面,也可能是任意其他的程序。当Drop时,希望在鼠标位置打开一个窗口浏览图片。

    不能期望其他程序响应Drop事件,只能自己控制。

    其实方法很简单,就是把你要做的事情放在DoDragDrop()方法的后面就可以了。

    void myControl_MouseMove(object sender, MouseEventArgs e)
    {  

        DragDrop.DoDragDrop(myControl, DragDropEffects.Copy,data)

    Window2 w = new Window2();

    Point p1 = MouseHelper.GetCursorPos();

    w.Top = p1.Y;

    w.Left = p1.X;

    w.Show();

    }

    就这么简单。注意:不能使用 p1 = e.GetPosition(this)的方法

    获得鼠标位置。因为这样获得的鼠标位置不准确。