博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Telerik控件学习】-建立自己的图形编辑工具(Diagram)
阅读量:6999 次
发布时间:2019-06-27

本文共 4354 字,大约阅读时间需要 14 分钟。

Telerik提供了RadDiagram控件,用于图形元素的旋转,拖拽和缩放.更重要的是,它还拓展了许多绑定的命令(复制,剪切,粘贴,回退等等).

我们可以用来组织自己的图形编辑工具.

Step1.定义图形元素容器(Shape)的基类,继承RadDiagramShape,并重写Serialize和Deserialize方法,来定制将来对象的保存或复制.

///     /// 图形Shape控件    ///     public class FigureShape : RadDiagramShape    {        public FigureShape()        {            IsConnectorsManipulationEnabled = false;        }        ///         /// 序列化        ///         /// 
public override SerializationInfo Serialize() { SerializationInfo serializationInfo = base.Serialize(); try { var obj = base.Content as FigureBase; if (obj != null) { IFormatter formatter = new BinaryFormatter(); using (var ms = new MemoryStream()) { formatter.Serialize(ms, obj); serializationInfo["Figure"] = Convert.ToBase64String(ms.ToArray()); } } } catch (Exception e) { throw new Exception("序列化过程失败:" + e.Message); } return serializationInfo; } /// /// 反序列化 /// /// public override void Deserialize(SerializationInfo serializationInfo) { base.Deserialize(serializationInfo); try { if (serializationInfo["Figure"] != null) { var buffer = Convert.FromBase64String(serializationInfo["Figure"].ToString()); IFormatter formatter = new BinaryFormatter(); using (var ms = new MemoryStream(buffer)) { Content = formatter.Deserialize(ms); //绑定Shape坐标和Figure坐标 this.DataContext = Content; var binding = new Binding("Position") { Mode = BindingMode.TwoWay }; this.SetBinding(PositionProperty, binding); } } } catch (Exception e) { throw new Exception("反序列化过程失败:" + e.Message); } } }
View Code

Step2.定义图形元素基类,并支持可序列化

///     /// 图形基类    ///     [Serializable]    public abstract class FigureBase : NotificationObject    {        ///         /// 图形位置        ///         private Point position;        public Point Position        {            get { return position; }            set { position = value; RaisePropertyChanged("Position"); }        }    }
View Code

Step3.定义基本图形元素,继承FigureBase,只列出一个示例,不再详述

[Serializable]    public class StationFig : FigureBase    {        ///         /// xml节点构造        ///         ///         public StationFig(XmlNode node)        {            var infoNode = node.ChildNodes.Cast
().FirstOrDefault(s => s.Name == "use"); var xAttri = infoNode.GetAttributeByName("x"); var yAttri = infoNode.GetAttributeByName("y"); this.Position = new Point(double.Parse(xAttri), double.Parse(yAttri)); this.StationType = infoNode.GetAttributeByName("class"); } ///
/// 厂站类型(220kv,500kv) /// private string stationType; public string StationType { get { return stationType; } set { stationType = value; RaisePropertyChanged("StationType"); } } }
View Code

Step4.定义图形元素的样式

View Code

Step5.界面编辑工具面板

View Code

Step6.关键步骤,定义Shape容器中ContentTemplate显示内容

View Code

Step7.增加图形元素到面板

///         /// 增加图元到绘图面板        ///         ///         private void AddFigureToDiagram(FigureBase figure)        {            var shape = new FigureShape() { DataContext = figure };            diagram.AddShape(shape);        }
View Code

编辑工具示例:(支持图元的旋转,移动,缩放,复制粘贴等操作,属性编辑,缩略图导航...)

 

 

 

转载于:https://www.cnblogs.com/lizzie-xhu/p/4236282.html

你可能感兴趣的文章
Spring Boot 中使用 Java API 调用 Elasticsearch
查看>>
HTTP/3 来啦,你还在等什么?赶紧了解一下
查看>>
一个合格的Webpack4配置工程师素养:第二部分
查看>>
利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」
查看>>
关于RxJava在业务上的一些思考
查看>>
MySQL8.0 新特性:Partial Update of LOB Column
查看>>
HTTP的历史
查看>>
对称加密、非对称加密、RSA(总结)
查看>>
Java高阶编程——RxBus 开源,基于 RxJava 的 event bus
查看>>
阿里云安全管家使用教程
查看>>
学习jQueryUI
查看>>
设计模式入门
查看>>
【函数式 Swift】可选值
查看>>
对使用Redux和Redux-saga管理状态的思考
查看>>
vscode中执行gulp的task
查看>>
intelli idea mac 的安装与配置
查看>>
说说如何使用 Tomcat 搭建文件服务器
查看>>
Vitalik探讨改进以太坊Casper CBC协议
查看>>
猎头最爱问的java面试题附答案(三)
查看>>
说说你生活中高颜值的程序员?
查看>>