当前位置: 首页 > news >正文

第四节:Nodify 连接端子手动连接

引言

第三节讲到,可以添加节点并通过后台代码连接端子。在实际的运用过程中通常需要在编辑器界面中去手动拖动端子进行连接,此时需要一个预连接模块,来存储手动拖动时接触的两个端子,并在鼠标松开后进行连接。

1、预连接模块

public partial class PendingConnectionViewModel : ObservableObject
{//编辑器对象private readonly EditorViewModel _editor;//开始 连接端子private ConnectorViewModel _source;public PendingConnectionViewModel(EditorViewModel editor){_editor = editor;}//记录开始连接端子[RelayCommand]private void Start(ConnectorViewModel source){_source = source;}//预连接结束时判断 并进行连接[RelayCommand]private void Finish(ConnectorViewModel target){if (target != null)_editor.Connect(_source, target);}
}

上节说到,连接关系存储在编辑器中,所以这里要传入编辑器对象,用编辑器的Connect方法连接两个端子。

2、编辑器

 public partial class EditorViewModel{public ObservableCollection<NodeViewModel> Nodes { get; set; } =new ObservableCollection<NodeViewModel>();public ObservableCollection<ConnectionViewModel> Connections { get; } =new ObservableCollection<ConnectionViewModel>();public PendingConnectionViewModel PendingConnection { get; }public EditorViewModel(){PendingConnection = new PendingConnectionViewModel(this);var welcome = new NodeViewModel(){Title = "Welcome",Input = new ObservableCollection<ConnectorViewModel>{new ConnectorViewModel { Title = "输入" }},Output = new ObservableCollection<ConnectorViewModel>{new ConnectorViewModel { Title = "输出" }},Location = new Point(10, 100)};var node2 = new NodeViewModel(){Title = "我的第二个节点",Input = new ObservableCollection<ConnectorViewModel>{new ConnectorViewModel { Title = "输入" }},Output = new ObservableCollection<ConnectorViewModel>{new ConnectorViewModel { Title = "输出" }}};var nodify = new NodeViewModel{Title = "To Nodify",Input = new ObservableCollection<ConnectorViewModel>{new ConnectorViewModel { Title = "In" }}};Nodes.Add(welcome);Nodes.Add(nodify);Nodes.Add(node2);Connections.Add(new ConnectionViewModel(welcome.Output[0], nodify.Input[0]));}//编辑器中的端子连接方法public void Connect(ConnectorViewModel source, ConnectorViewModel target){var newConnection = new ConnectionViewModel(source, target);//检查是否已存在相同的连接if (!Connections.Contains(newConnection)){Connections.Add(newConnection);}}
}

2、xaml 绑定

 <Grid><nodify:NodifyEditorName="Editor"Connections="{Binding Connections}"ItemsSource="{Binding Nodes}"PendingConnection="{Binding PendingConnection}"><nodify:NodifyEditor.DataContext><vm:EditorViewModel /></nodify:NodifyEditor.DataContext><nodify:NodifyEditor.ItemTemplate><DataTemplate DataType="{x:Type mod:NodeViewModel}"><nodify:NodeHeader="{Binding Title}"Input="{Binding Input}"Output="{Binding Output}"><nodify:Node.InputConnectorTemplate><DataTemplate DataType="{x:Type mod:ConnectorViewModel}"><nodify:NodeInputAnchor="{Binding Anchor, Mode=OneWayToSource}"Header="{Binding Title}"IsConnected="{Binding IsConnected}" /></DataTemplate></nodify:Node.InputConnectorTemplate><nodify:Node.OutputConnectorTemplate><DataTemplate DataType="{x:Type mod:ConnectorViewModel}"><nodify:NodeInputAnchor="{Binding Anchor, Mode=OneWayToSource}"Header="{Binding Title}"IsConnected="{Binding IsConnected}" /></DataTemplate></nodify:Node.OutputConnectorTemplate></nodify:Node></DataTemplate></nodify:NodifyEditor.ItemTemplate><nodify:NodifyEditor.ConnectionTemplate><DataTemplate DataType="{x:Type vm:ConnectionViewModel}"><nodify:StepConnection Source="{Binding Source.Anchor}" Target="{Binding Target.Anchor}" /></DataTemplate></nodify:NodifyEditor.ConnectionTemplate><nodify:NodifyEditor.PendingConnectionTemplate><DataTemplate DataType="{x:Type vm:PendingConnectionViewModel}"><nodify:PendingConnectionAllowOnlyConnectors="True"CompletedCommand="{Binding FinishCommand}"StartedCommand="{Binding StartCommand}" /></DataTemplate></nodify:NodifyEditor.PendingConnectionTemplate></nodify:NodifyEditor></Grid>

http://www.mrgr.cn/news/11013.html

相关文章:

  • 代码随想录算法训练营day53:图04:104.建造最大岛屿;110. 字符串接龙;105.有向图的完全可达性
  • Mac外接4K显示器 字体大小适应 设置HIDPI
  • 开源低代码LLM编排平台Dify:可视化Agent和工作流,如何部署在自己系统中,自定义修改前后端详解
  • PHP在现代Web开发中的高效应用与实战案例
  • SpringMVC - 第一个 SpringMVC 程序
  • OpenCV+Python自动填涂机读卡
  • OpenCV绘图函数(2)绘制圆形函数circle()的使用
  • 用Python插入SVG到PDF文档
  • 数学建模学习(118):牛顿冷却定律的原理解析、案例分析与Python求解
  • 【HuggingFace Transformers】BertIntermediate 和 BertPooler源码解析
  • 沈阳网站建设手机能看的网站
  • 0基础学习Python路径(29)collections模块
  • ubuntu系统在线安装下载firefox-esr流览器
  • WIN11环境下,如何在指定目录快速启动jupyter lab或jupyter notebook
  • MongoDB适用场景
  • 空气净化器怎么选能除猫毛?宠物空气净化器除味好的分享
  • GLM-4-Flash 大模型API免费了,手把手构建“儿童绘本”应用实战(附源码)
  • redis面试(二十三)写锁释放
  • 国产游戏技术的崛起:能否挑战全球引领地位?
  • 【单调栈】|代码随想录算法训练营第42天|42. 接雨水、 84.柱状图中最大的矩形