首页 > 编程语言 >用Wpf做一个Block编程画板(续5-Diagram画板,仿Scratch)

用Wpf做一个Block编程画板(续5-Diagram画板,仿Scratch)

时间:2023-07-02 12:23:41浏览次数:77  
标签:Scratch diagramViewModel 画板 Next Diagram item Items null Block

用Wpf做一个Block编程画板(续5-Diagram画板)

先上一张效果动图,本次更新主要仿照Scratch,目前仅完成拖拽部分,逻辑部分后续完善。

同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram

本次扩展主要内容:

1.Block模块,入口在文件新建下。

2.简易Block的使用:

3.仿Scratch的Block的使用(完成图鉴,准备编写逻辑):

核心逻辑在源码的BlockDesignerItemViewModelHelper中:

 public static void FinishNearBlock(this IBlockDiagramViewModel diagramViewModel, List<BlockDesignerItemViewModel> blocks)
{
    if (diagramViewModel == null)
        return;

    if (blocks.Any())
    {
        var links = BlockDesignerItemTempLink.Build(blocks);

        blocks.ToList().ForEach(p => {
            p.ZIndex = diagramViewModel.Items.Where(q => q.ZIndex != int.MaxValue).Any() ? diagramViewModel.Items.Where(q => q.ZIndex != int.MaxValue).Max(r => r.ZIndex) + 1 : 0;
        });

        foreach (BlockDesignerItemTempLink item in links)
        {
            var container = diagramViewModel.FindNearContainerToAttachTo(item);
            if (container != null)
            {
                int index = 0;
                var child = container.Children.FirstOrDefault(p => p.Connectors.Any(q => q.BeAttachTo == true));
                if (child != null)
                {
                    index = container.Children.IndexOf(child);
                    if (child.RightConnector?.BeAttachTo == true || child.BottomConnector?.BeAttachTo == true)
                    {
                        index++;
                    }
                }
                diagramViewModel.InsertChildCommand.Execute(new BlockContainerPara() { Item = container.DataItem, Child = item.Items.FirstOrDefault(), Container = container, Index = index });
                continue;
            }

            var portTuple = diagramViewModel.FindNearPortToAttachTo(item);
            var portParent = portTuple.Item1;
            var portNext = portTuple.Item2;

            if (portParent != null)
            {
                diagramViewModel.AddNextCommand.Execute(new BlockNextPara() { Item = portParent.DataItem as BlockDesignerItemViewModel, Next = item.Items.FirstOrDefault() });
                portParent.BeAttachTo = false;
                portParent.DisableAttachTo = false;
            }
            else
            {
                if (item.Items.FirstOrDefault().Parent != null)
                {
                    diagramViewModel.RemoveNextCommand.Execute(new BlockNextPara() { Item = item.Items.FirstOrDefault().Parent as BlockDesignerItemViewModel, Next = (item.Items.FirstOrDefault().Parent as BlockDesignerItemViewModel)?.Next });
                }
            }

            if (portNext != null)
            {
                diagramViewModel.AddNextCommand.Execute(new BlockNextPara() { Item = item.Items.LastOrDefault(), Next = portNext.DataItem as BlockDesignerItemViewModel });
                portNext.BeAttachTo = false;
                portNext.DisableAttachTo = false;
            }
            else
            {
                if (item.Items.LastOrDefault().Next != null)
                {
                    diagramViewModel.RemoveNextCommand.Execute(new BlockNextPara() { Item = item.Items.LastOrDefault(), Next = item.Items.LastOrDefault()?.Next });
                }
            }
        }

        diagramViewModel.ClearAttachTo();
    }
}

大致原理是:判断Block是否被拖入某个容器,如果没有,是否挨着另外一个Block块。

本次更新的内容基本如上,后续会完善Block的逻辑部分。比传统的组态的优势是,更加节约地方与直观了,要实现一个Scratch的路还很长,我会优先完成一些容易的部分,封装一个BlockEditor,敬请期待。

标签:Scratch,diagramViewModel,画板,Next,Diagram,item,Items,null,Block
From: https://www.cnblogs.com/akwkevin/p/17520622.html

相关文章

  • DevExpress中Diagram中常用的一些方法
    1、Diagram中插入一个形状的方法:DiagramShapediagramShape=newDiagramShape();//新建一个形状对象diagramShape.Shape=DevExpress.Diagram.Core.BasicShapes.Rectangle;//赋值为一个基础图形:矩形diagramShape.ConnectionPoints=newPointCollection(newList<PointFloa......
  • 画板生成海报图
    画板生成海报图<canvasid="myCanvas"canvas-id="myCanvas"style="width:320px;height:520px"@longpress="saveTheQrCode(goods_poster)"></canvas>网络生成的图片需要使用promose进行一下异步处理这样可以方式因为异步问题造成海报无法生成 getImageInfo(i......
  • Android中实现双缓冲(画板应用)和XML文件定义菜单
    1.什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果。为什么要使用双缓冲技术?拿Android游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容。如何实现双缓冲?使用一个Bitmap对象保留之前的画......
  • Thermodynamics---PV Diagram
    Thermodynamics---PVDiagram我们这里主要讨论上面四种PV图的\(\DeltaU,Q,W\),其中\(\DeltaU\)是系统的内能,\(Q\)是系统吸收的能量,\(W\)是外界对系统做的功,我们在理想单原子气体上面讨论。Preliminaries我们一般把内能\(U\)看做温度和体积的函数,即\(U=U(V,T)\),所以\(U\)......
  • 适合中小学学生初次学习编程语言Scratch
    2023年4月接触了Scratch,不用写代码,全图形化,拖动图标即可完成编程,简单几步能做出‘切西瓜'等小游戏或效果。入门简单Scratch适合中小学学生初次学习编程语言时使用,尤其是没有编程基础或编程基础较少的孩子,用来进行编程启蒙最合适不过了。 内容丰富Scratch编程内容丰富,形式多......
  • w-process diagram
    nonumberscan'tcomapreanythingcan'tdescribetrends natrualcycles.lifecycleofabutterfly Whatcanwedescribe?howmanysteps.wheretheprocessbeginsandendseachstepintheprocess. spetslanguages:Atthefirststagein......
  • 用Wpf做一个画笔画板(续5-Diagram画板)
    先上效果图吧同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次实现的内容有[1]画笔实现[2]封闭画笔实现[3]钢笔实现[4]文字画笔[5]直线,矩形,椭圆[6]Path形状[7]取色器[8]三种画笔可选画笔示例入口  示例截图 核心代......
  • LFS - Linux From Scratch 从零开始全记录 - 1 准备篇
    上次折腾LFS已经是好几年前了,只记得最后用VMware引导成功了,好多技术细节已经不记得了。趁着最近有空,再来折腾一次。这一次用的一台新的Win10PC,目标是在一个U盘上构建LFS,然后用U盘引导物理机,顺便记录一下整个过程。准备阶段下载虚拟机、Ubuntu镜像下载安装Microso......
  • ## 用Wpf做一个可编程画板(续4-Diagram画板)
    先上一张效果动图。同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次扩展的主要内容1.可编程模块,使用C#语言。2.控制台打印控件,可以打印程序中的Console.WriteLine数据3.为了便于大家使用,写了一个Box工厂分配Box的数据流向效果图。可编程模块......
  • 数学软件|网络画板
    ......