【Syncfusion系列】Diagram 杂谈第一篇

前言

我认为 DiagramSyncfusion 中首屈一指的优秀控件!最近在写一个工作流引擎,前端界面就用的是Diagram ,接下来就来看一看。

Diagram的事件

查看 SfDiagram的属性,如果想实现什么事件,就看这些Command结尾的。
在这里插入图片描述
这里,我想看看 双击Diagram中的一个节点,能触发什么事件。
于是,我找到了,ItemDoubleTappedCommand!
我使用 prism 的方式 进行绑定:

ItemDoubleTappedCommand="{Binding ItemDoubleTappedCmd}"

其实这个并不是一个事件(并不能双击一下自动产生一个事件),而是封装好的命令,就是给mvvm用的, 看看源码就知道:

//
// 摘要:
//     Gets or sets the itemdoubletappedcommand to invoke when double// click on the diagram
//     or diagram elements.
public ICommand ItemDoubleTappedCommand
{get{return (ICommand)GetValue(ItemDoubleTappedCommandProperty);}set{SetValue(ItemDoubleTappedCommandProperty, value);}
}

注意,这个命令,不管是双击,diagram或者是其中的元素,都会触发该事件。并且双击节点的不同位置,触发传递的参数还会有所不同,后面介绍。

ItemDoubleTappedCmd = new DelegateCommand<ItemDoubleTappedEventArgs>((args) => {try{//注意这里点的位置不同,返回的参数不一样,但是都可以获取到Node!VisualNode node = args.OriginalSource as VisualNode;if (node == null){node = args.Item as VisualNode;if (node == null){return;}                            }    
});

后台实现命令如上。
在这里插入图片描述

如果点击在节点的说明上,args的值如下:
在这里插入图片描述
此时,node的相关信息包含在,OriginalSource里面。

如果点击没在节点的说明上(说明的周边),args的值如下:
在这里插入图片描述
此时,node的相关信息包含在,Item里面。

如果此时你没点任何节点,而是双击在了空白处!在这里插入图片描述
此时 Item里面包含的是 Diagram 对象。

这里讲的是 ItemDoubleTappedCommand 双击的事件,那么其他的,请自行测试!

如何通过node拿到Diagram

通过上面那个事件,我们可以拿到当前被双击的Node对象,那么如何通过Node拿到Diagram 对象呢?

 //双击触发节点ItemDoubleTappedCmd = new DelegateCommand<ItemDoubleTappedEventArgs>(async(args) => {try{//注意这里点的位置不同,返回的参数不一样,但是都可以获取到Node!VisualNode node = args.OriginalSource as VisualNode;if (node == null){node = args.Item as VisualNode;if (node == null){return;}                            }#region  这里开始拿对象//-- 这里演示了,如何通过node得到diagramcontrol!!!!var a = node.Info as IGroupableInfo;var manager = a.Graph.CommandManager;var diagramcontrol = manager.View as SfDiagram;#endregion}catch (Exception ex){MessageBox.Show(ex.Message);}});

通过Node拿到Diagram确实废了我一番功夫,有很多类是对外隐藏的,所以没办法直接进行强制转换,Diagram的相关代码中有很多,先转为接口,才能拿到某些属性的例子。

比如

 public NodeViewModel FindNextNode(NodeViewModel node){var out_nodes = (node.Info as INodeInfo).OutNeighbors as IEnumerable<object>;if (out_nodes != null && (out_nodes).Count() > 0){foreach (NodeViewModel outnode in out_nodes){if (node != outnode){return outnode;}}}return null;}

我们需要多熟悉他们的数据结构,并熟悉这种写法。

命令取消

Diagram 封装了很多自带的命令,比如对齐,旋转,复制,剪切,撤回,全选,等等,一共48个,如下图:,
在这里插入图片描述

在这里插入图片描述
这些命令都是开箱即用的,非常方便! 但是有的时候,我却是想去掉某些命令。
比如,它自带的编辑命令,当我们双击的时候,会触发编辑命令,节点会进入编辑状态,这个是我不想要的,(我想实现弹窗)
在这里插入图片描述
那如何取消呢?我们继续完善代码!

//双击触发节点
ItemDoubleTappedCmd = new DelegateCommand<ItemDoubleTappedEventArgs>(async(args) => {try{//注意这里点的位置不同,返回的参数不一样,但是都可以获取到Node!VisualNode node = args.OriginalSource as VisualNode;if (node == null){node = args.Item as VisualNode;if (node == null){return;}                            }#region  这里用来取消双击导致的编辑这个副作用,  Cancel命令是一个多功能命令,可以根据上下文执行不同的操作,如停止编辑注释并接受当前的编辑结果,或者清除图表元素的选择和键盘焦点。await Task.Delay(50);//-- 这里演示了,如何通过node得到diagramcontrol!!!!var a = node.Info as IGroupableInfo;var manager = a.Graph.CommandManager;var diagramcontrol = manager.View as SfDiagram;// 得到graphinfo IGraphInfo graphinfo = diagramcontrol.Info as IGraphInfo;// 命令取消!graphinfo.Commands.Cancel.Execute(null); #endregion}catch (Exception ex){MessageBox.Show(ex.Message);}});

那效果如下,明显有个取消的过程:
在这里插入图片描述
这里,你会不会好奇,代码里面为啥,加了一个异步?await Task.Delay(50);
你可以尝试把这个异步去掉,你会发现没有效果!
其实这段代码必须,写道//双击触发节点
ItemDoubleTappedCmd = new DelegateCommand(async(args) => {

这个函数外面才会有效,就是如果这个函数没退出,直接取消是没有用的!
我遇到过,很多情况都是这样。
不过,我发现了一个更优雅的写法,就是这个异步。
主线程,遇到这个await Task.Delay(50); 其实就会挑走,从而出了这个函数
当50毫秒时间一到,就会又调回来,这样就和写道外面是一样的了,于是就生效了!!!!
是不是又学了一招呢?(手动狗头~~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8940.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器】使用命令行文本编辑器(如 vim、nano 或 vi)创建文件并编辑

【服务器】使用命令行文本编辑器&#xff08;如 vim、nano 或 vi&#xff09;创建文件并编辑 准备&#xff1a;连接至服务器&#xff08;如ssh&#xff09;创建 .ncl 文件方法 1: 使用 vim 创建 .ncl 文件方法 2: 使用 nano 创建 .ncl 文件确认文件已创建运行 .ncl 文件 总结参…

[DB] Project-1-MySQL

下载并安装了MySQL-8.0.40 root; 密码为6位 MySQL安装教程&#xff08;详细版&#xff09;_mysql安装教程8.0.36-CSDN博客 解决&#xff1a;管理员身份运行cmd出现mysql : 无法将“mysql”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;…

【JavaEE进阶】导读

本节⽬标 了解什么是JavaEE 在JavaEE中, 我们学习什么, 如何学, 难点是什么 一、Java EE 发展历程 Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习…

.NET 黑名单上传 突破WAF防护的SoapShell (免杀版)

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

多线程和线程同步复习

多线程和线程同步复习 进程线程区别创建线程线程退出线程回收全局写法传参写法 线程分离线程同步同步方式 互斥锁互斥锁进行线程同步 死锁读写锁api细说读写锁进行线程同步 条件变量生产者消费者案例问题解答加强版生产者消费者 总结信号量信号量实现生产者消费者同步-->一个…

MySQL_第13章_视图

1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图&#xff1f; 视图一方面可以使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。 2.2 视图的理解 视图是一种虚拟表&#xff0c;本身是不具有数据的&#xff0c;占用很少的内存…

Python数据分析-Netflix数据分析和可视化

一、研究背景 在当今时代&#xff0c;流媒体技术迅猛发展&#xff0c;如风暴般席卷全球娱乐产业&#xff0c;重塑了大众的娱乐消费模式。Netflix 在这一潮流中一马当先&#xff0c;成为全球首屈一指的在线流媒体平台。自 2007 年开启流媒体服务后&#xff0c;Netflix 就马不停…

数据集市是什么?有什么优势?

一、数据集市是什么&#xff1f; 1、数据集市的产生背景&#xff1a; 因为数据仓库的工作范围和成本比较巨大&#xff0c;技术部门必须对所有的以全企业的眼光对待任何一次决策分析&#xff0c;这样就变成了成本高、耗时高的大项目&#xff0c;而且这种集中式的数据处理方式往往…

Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

代码地址 https://github.com/junjie18/CMT 1. 引言 在本文中&#xff0c;我们提出了Cross-Modal Transformer&#xff08;CMT&#xff09;&#xff0c;这是一种简单而有效的端到端管道&#xff0c;用于鲁棒的3D对象检测&#xff08;见图1&#xff08;c&#xff09;&#xf…

Oracle数据库 查看SQL执行计划的几种方法

前言 在日常的运维工作中&#xff0c;SQL优化是DBA的进阶技能&#xff0c;SQL优化的前提是要看SQL的执行计划是否正确&#xff0c;下面分享几种查看执行计划的方法&#xff0c;每一种方法都各有各的好处&#xff0c;可以根据特定场景选择某种方法。 一.使用AUTOTRACE查看执行…

简单介绍Nginx服务器的反向代理、负载均衡

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

域名+服务器+Nginx+宝塔使用SSL证书配置HTTPS

前言 在我的前面文章里&#xff0c;有写过一篇文章 linux服务器宝塔从头部署别人可访问的网站 在这篇文章&#xff0c;有教学怎么使用宝塔和买的服务器的公网IP&#xff0c;以及教怎么打包vue和springboot去部署不用域名的网站让别人访问 那么&#xff0c;这篇文章将在这个…

Chromium 中chrome.webRequest扩展接口定义c++

一、chrome.webRequest 注意 &#xff1a;从 Manifest V3 开始&#xff0c;"webRequestBlocking" 权限不再适用于大多数扩展程序。以 "declarativeNetRequest" 为例&#xff0c;它允许使用 declarativeNetRequest API。除了 "webRequestBlocking&quo…

.NET中通过C#实现Excel与DataTable的数据互转

在.NET框架中&#xff0c;使用C#进行Excel数据与DataTable之间的转换是数据分析、报表生成、数据迁移等操作中的常见需求。这一过程涉及到将Excel文件中的数据读取并加载至DataTable中&#xff0c;以便于利用.NET提供的丰富数据处理功能进行操作&#xff0c;同时也包括将DataTa…

多个NVR同时管理EasyNVR多品牌NVR管理工具/设备:IP常见问题解决方案

随着视频监控技术的不断发展&#xff0c;NVR&#xff08;网络视频录像机&#xff09;已经成为现代安防系统的重要组成部分。而为了更高效地管理多个品牌的NVR设备&#xff0c;EasyNVR这一多品牌NVR管理工具应运而生。然而&#xff0c;在实际使用过程中&#xff0c;尤其是在多个…

虚幻引擎 CEO 谈元宇宙:发展、策略与布局

在当今科技领域&#xff0c;元宇宙无疑是最热门的话题之一。Epic Games 首席执行官 Tim Sweeney 对元宇宙的未来发展充满信心&#xff0c;他认为开放元宇宙将融合娱乐、游戏和科技产业&#xff0c;带来一个光明的未来。本文将深入探讨采访中的关键内容&#xff0c;分析元宇宙的…

支付宝与华为终端联手,移动支付即将进入“碰时代”

大家好&#xff0c;我是小悟。 支付宝与华为终端强强联手&#xff0c;达成了战略合作&#xff01;这可不仅仅是个简单的合作哦&#xff0c;它预示着我们的移动支付方式即将迎来一场革命性的变革&#xff0c;正式进入“碰时代”&#xff01; 支付宝&#xff0c;作为全球领先的…

常用机器人算法原理介绍

一、引言 随着科技的不断发展&#xff0c;机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心&#xff0c;它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理&#xff0c;包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

【go从零单排】迭代器(Iterators)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;迭代器的实现通常不是通过语言内置的迭代器类型&#x…

Java 连接操作 MySQL 数据库(增删查改操作)

环境 MySQL 5.5 版本eclipseMySQL 连接驱动 mysql-connector-java-5.1.18-bin.jar mysql8.0之前的版本与之后的版本使用的jar包是不同的&#xff0c;在使用时也有一定的区别。这里&#xff0c;我的 MySQL 版本为 5.5。 准备工作 将 jar 包添加到项目中&#xff0c;右键项目&a…