需求:

  1. 拓扑图的节点可以拖动

  2. 当有警报时,在节点上需要提示,直至警报解除

  3. 拓扑图所在的窗口可以变动大小。当缩小主窗口,拓扑图显示不下时,需要出现滚动条,此时拖动icon到拓扑图边缘,滚动可以跟随移动。

  4. 拓扑图节点的位置保存导出,以便下次打开拓扑图时可以实现复原

拖动的实现

利用WPF的MouseDragElementBehavior实现拓扑图的各个节点的拖动。使用MouseDragElementBehavior需要添加两个Reference:Microsoft.Expression.Interactions和System.Windows.Interactivity。

    publicpartialclassDragIcon :UserControl
{
MouseDragElementBehavior dragBehavior = null;
public DragIcon()
{
InitializeComponent();
}
privatevoidInitializedragBehavior()
{
dragBehavior = newMouseDragElementBehavior();
dragBehavior.Attach(this);
}
}

报警的实现:

节点的拖动,为了在拓扑图(TopologicalView)的范围内拖动,于是将MouseDragElementBehavior 的ConstrainToParentBounds设置为true,然后alert的实现,就自然想通过Popup来实现。但是Popup有两个问题,一是不会跟随节点拖动,二是总显示在所有窗体的前面(包括别的软件)。针对问题一,可以通过将GetMethod访问Popup的私有函数UpdatePosition,重新指定Popup的位置。问题二,虽然通过user32.dll的SetWindowPos的方法将Popup的设置为NotTopmost,可以不显示在别的软件前面,但是拖动到拓扑图的边缘时,节点会被边缘遮挡,但是Popup不会,感觉比较奇怪。于是最终放弃Popup,直接通过添加一个image来实现。但是这样节点的整个的大小就变大了,为了使节点可以拖动到拓扑图的边缘,又将ConstrainToParentBounds设置为false,然后通过控制鼠标的位置实现在拓扑图的范围内拖动。详细请看下一节【节点拖动时带动滚动条的实现】。

问题一的解决方法(来源http://www.cnblogs.com/xiaokang088/archive/2011/07/06/2099489.html):

    var mi = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
mi.Invoke(popBottom, null);

问题二的解决方法(来源http://www.cnblogs.com/Leaco/p/3164394.html):

{CSDN:CODE:2322488}

节点拖动时带动滚动条的实现:

将TopologicalView中各个节点是否处在拖动中的状态进行MultiBinding,绑定到TopologicalView的一个附加属性IconDragging中,然后在主窗口的MouseMove的事件响应函数中,当TopologicalView的IconDragging为true时,对鼠标位置进行判断,看是否超出显示范围,如果超出显示范围,对鼠标位置进行重新设定,并设定滚动条的位置。

前三节的具体的代码请参看http://download.csdn.net/detail/xiudou_123/9806342

节点位置保存的实现:

在DragIcon中定义附加属性DragBehaviorX和DragBehaviorY,然后和MouseDragElementBehavior的X,Y的进行绑定,就能够实时取到拖动节点的位置信息,但是MouseDragElementBehavior的X,Y是相对于窗口的绝对位置,所以需要转换成TopologicalView的相对信息,这就需要知道TopologicalView的左上角相对于窗口的位置。另外MouseDragElementBehavior的X,Y是DragIcon的左上角的位置,为了定位到DragIcon的中心点,所以还需要进行转换,这里的计算不难,但是位置的转换稍微有些绕,需要小心。进行了所有这些计算后,将值保存到另外两个附加属性LocationX和LocationY。父窗口可以直接对LocationX和LocationY进行取值,也可以通过绑定实现取值。

具体请看例子http://download.csdn.net/detail/xiudou_123/9808949

例子是通过绑定的形式,将LocationX和LocationY绑定到一个IconLocation的类中,所以可以直接对IconLocation进行保存或取值实现自己需要的功能。

节点位置复原的实现:

新建一个DragIcon,需要指定其位置时,通过设置MouseDragElementBehavior的X,Y是不行的,但是可以通过在Loaded事件中设置DragIcon的RenderTransform来实现。

RenderTransform = new TranslateTransform(Point.X, Point.Y);

具体也请看例子http://download.csdn.net/detail/xiudou_123/9808949

拓扑图节点拖动的实现(学习笔记)相关推荐

  1. kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件

    学习资源:<Excel VBA从入门到进阶>第60集 by兰色幻想 本节讲Treeview控件. TreeView控件是以树形结构显示数据的控件.利用TreeView控件,可以设计出树形结 ...

  2. Spring动力节点老杜课程学习笔记

    没有Spring的时候我们如何进行开发的? 没有Spring为我们服务的,写代码一定是这样的 调用层: public static void main(String[] args) {//创建视图层对 ...

  3. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  4. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面

    先看之前的节点操作方法:Mr.J-- jQuery学习笔记(二十)--节点操作方法 Mr.J-- jQuery学习笔记(五)--属性及属性节点 Mr.J-- jQuery学习笔记(十一)--事件委托  ...

  5. 【目录】全志F1C100S/F1C200S学习笔记

    全志F1C100S/F1C200S学习笔记目录 全志F1C100S/F1C200S学习笔记(1)--基础简介及资料 全志F1C100S/F1C200S学习笔记(2)--TF卡分区及系统构建烧录 全志F ...

  6. 方舟编译器学习笔记分类与导读

    方舟学习笔记系列,从方舟开源到现在,已经写了50多篇,保证了每天一篇的更新频率.篇数增加之后,文章的分类以及文章之间的关系,逐渐变得复杂起来.本文将对已发表的学习笔记系列进行分类和导读,方便读者更好的 ...

  7. LabView学习笔记(八):属性节点

    Labview学习笔记: LabView学习笔记(一):基础介绍 LabView学习笔记(二):滤波器实验 LabView学习笔记(三):基本控件 LabView学习笔记(四):动态数据类型 LabV ...

  8. oracle rac添加监听,【学习笔记】Oracle 10G RAC增加节点时手动注册监听服务的案例步骤...

    [学习笔记]Oracle 10G RAC增加节点时手动注册监听服务的案例步骤 时间:2016-10-22 22:53   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 Ora ...

  9. Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动

    对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象, ...

最新文章

  1. 先搞懂这八大基础概念,再谈机器学习入门!
  2. 去水印--《On the Effectiveness of Visible Watermarks》
  3. python怎么打开shell界面-使用IDLE的Python shell窗口实例详解
  4. 全国计算机等级考试一级教程讲义资料,计算机等级考试一级教程讲义.docx
  5. DevExpress RichEditControl 上下翻页功能 z
  6. 【Linux系统编程】POSIX无名信号量
  7. Python科学计算:Pandas
  8. jquery特效(1)—点击展示与隐藏全文
  9. Developer's Guide to Microsoft Enterprise Library, C# Edition
  10. java中实现工厂日历_Java Calendar实现控制台日历
  11. 前大厂员工谈中美企业区别,中企不用单元测试,仅靠QA检查代码?
  12. ICEM使用经验与网格划分错误分析
  13. 欢乐时光病毒5月7日将发作
  14. 华三s5000配置镜像接口_H3C系列交换机端口镜像的配置
  15. 延时delay1s程序 c语言,汇编语言软件延时1s的实现方法
  16. Spring Boot 实现通用 Auth 认证的 4 种方式!
  17. Java入门 二维数组、一维数组、多维数组的解析(第十三天)
  18. 磁盘管理关于磁盘的概念
  19. 金蝶软件怎么过账_金蝶专业版怎么反过账
  20. 在ubuntu 18上进行NPB和mpiP的整合

热门文章

  1. 【万字长文,Java常用算法面试题
  2. 阿里云服务器域名解析,详细步骤
  3. Unity接入百度语音识别SDK windows平台
  4. 携手用友低代码开发,德鑫物联将RFID融入企业服务大生态
  5. 美不可言的CSS 三
  6. python爬虫分析——广州租房信息爬取并分析
  7. 2021_GDUT_Dynamic Programming
  8. Flutter 季度调研结果分享 | 聚焦多平台开发者关注的问题
  9. 实体企业直播困局该如何打破
  10. HTML入门笔记(附完整代码)