- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第
C#wpf实现窗口任意区域点击拖动
目录前言一、简单拖动二、事件冲突问题三、解决方法四、效果预览五、使用示例1、白板的工具条(1)、MainWindow.xaml(2)、MainWindow.xaml.cs(3)、效果预览总结
前言
点击窗口任意区域可移动功能,在一些业务场景中会使用到,比如工具条或者球形状的窗口等。在wpf要实现此功能简单形式还是比较容易的,但是有一些细节需要专门处理,比如与按钮的点击事件冲突问题,解决事件冲突问题后拖动的灵敏度,可复用性等。
一、简单拖动
基础的拖动功能直接使用Window类的DragMove即可实现:
在Window的PreviewMouseLeftButtonDown中调用DragMove即可。
示例如下:
WindowPreviewMouseLeftButtonDown=Window_PreviewMouseLeftButtonDown/
voidWindow_PreviewMouseLeftButtonDown(objectsender,System.Windows.Input.MouseButtonEventArgse)
DragMove();
}
注:本文实现的是窗口任意区域拖动(比如按钮占满整个窗口),不适用于一般窗口拖动,一般窗口拖动请使用MouseLeftButtonDown事件
二、事件冲突问题
根据上述方法实现窗口拖动后发现出现了事件冲突,即窗口内的控件无法相应鼠标点击事件了。因为DragMove的内部实现使用了SC_MOVE,使标题栏(win32窗口)捕获鼠标,原本窗口失去鼠标捕获。窗口内的控件无法响应鼠标消息,因此上述简单拖动在有控件的窗口中是不可行的(局部拖动是可行的,但本文讲的是任意区域拖动)。
三、解决方法
解决方法是不在鼠标按下事件中触发拖动,而是在鼠标移动后触发拖动操作。具体步骤如下:
1、注册3个事件如下:
WindowPreviewMouseLeftButtonDown=Window_PreviewMouseLeftButtonDown
PreviewMouseMove=Window_PreviewMouseMove
PreviewMouseLeftButtonUp=Window_PreviewMouseLeftButtonUp/
2、定义2个变量记录信息。
Point_pressedPosition;
bool_isDragMoved=false;
3.记录鼠标按下位置
voidWindow_PreviewMouseLeftButtonDown(objectsender,System.Windows.Input.MouseButtonEventArgse)
_pressedPosition=e.GetPosition(this);
}
4.鼠标移动触发拖动
voidWindow_PreviewMouseMove(objectsender,System.Windows.Input.MouseEventArgse)
if(Mouse.LeftButton==MouseButtonState.Pressed_pressedPosition!=e.GetPosition(this))
_isDragMoved=true;
DragMove();
}
5.鼠标弹起屏蔽消息
voidWindow_PreviewMouseLeftButtonUp(objectsender,MouseButtonEventArgse)
if(_isDragMoved)
_isDragMoved=false;
e.Handled=true;
}
四、效果预览
五、使用示例
由于评论区反馈上述方法存在bug,但是无奈笔者始终没有重现,怀疑是使用方法不正确,或者对本博文讲述功能理解上的差异导致的,在此根据上述方法初版原封不动的编写如下使用示例,以说明使用场景以及使用方法。
1、白板的工具条
(1)、MainWindow.xaml
Windowx:xmlns=/winfx/2006/xaml/presentation
xmlns:x=/winfx/2006/xaml
xmlns:d=/expression/blend/2008
xmlns:mc=/markup-compatibility/2006
xml
文档评论(0)