第五节:Nodify 节点位置设置

news2024/9/29 21:25:04

引言

如果你尝试过前几节的代码,会发现节点都是出现在0,0 位置,及编辑器左上角。编辑器作为最外层的交互控件,内部封装了节点容器ItemContrainer,我们通过样式属性对Loaction做绑定。本节将介绍如何配置节点位置。

1、节点位置

需要在节点类中增加System.Windows.Point类型 位置属性

public partial class NodeViewModel : ObservableObject
{
    public string Title { get; set; }
    //节点位置
    [ObservableProperty]
    Point _location;
    public ObservableCollection<ConnectorViewModel> Input { get; set; } =
        new ObservableCollection<ConnectorViewModel>();
    public ObservableCollection<ConnectorViewModel> Output { get; set; } =
        new ObservableCollection<ConnectorViewModel>();
}

2、位置绑定

在编辑器中绑定节点位置属性

<nodify:NodifyEditor.ItemContainerStyle>
    <Style TargetType="{x:Type nodify:ItemContainer}">
        <Setter Property="Location" Value="{Binding Location}" />
    </Style>
</nodify:NodifyEditor.ItemContainerStyle>

完整xaml代码如下

 <Grid>
     <nodify:NodifyEditor
         Name="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:Node
                     Header="{Binding Title}"
                     Input="{Binding Input}"
                     Output="{Binding Output}">
                     <nodify:Node.InputConnectorTemplate>
                         <DataTemplate DataType="{x:Type mod:ConnectorViewModel}">
                             <nodify:NodeInput
                                 Anchor="{Binding Anchor, Mode=OneWayToSource}"
                                 Header="{Binding Title}"
                                 IsConnected="{Binding IsConnected}" />
                         </DataTemplate>
                     </nodify:Node.InputConnectorTemplate>
                     <nodify:Node.OutputConnectorTemplate>
                         <DataTemplate DataType="{x:Type mod:ConnectorViewModel}">
                             <nodify:NodeInput
                                 Anchor="{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:PendingConnection
                     AllowOnlyConnectors="True"
                     CompletedCommand="{Binding FinishCommand}"
                     StartedCommand="{Binding StartCommand}" />
             </DataTemplate>
         </nodify:NodifyEditor.PendingConnectionTemplate>
         <nodify:NodifyEditor.ItemContainerStyle>
             <Style TargetType="{x:Type nodify:ItemContainer}">
                 <Setter Property="Location" Value="{Binding Location}" />
             </Style>
         </nodify:NodifyEditor.ItemContainerStyle>
     </nodify:NodifyEditor>

 </Grid>

在编辑器构造中添加示例编辑器代码运行查看本节演示内容

 var welcome = new NodeViewModel()
 {
     Title = "我的第一个节点",
     Input = new ObservableCollection<ConnectorViewModel>
     {
         new ConnectorViewModel { Title = "输入" }
     },
     Output = new ObservableCollection<ConnectorViewModel>
     {
         new ConnectorViewModel { Title = "输出" }
     },
     Location = new Point(10, 10)
 };
 var node2 = new NodeViewModel()
 {
     Title = "我的第二个节点",
     Input = new ObservableCollection<ConnectorViewModel>
     {
         new ConnectorViewModel { Title = "输入" }
     },
     Output = new ObservableCollection<ConnectorViewModel>
     {
         new ConnectorViewModel { Title = "输出" }
     },
     Location = new Point(50, 100)
 };
 var nodify = new NodeViewModel
 {
     Title = "To Nodify",
     Input = new ObservableCollection<ConnectorViewModel>
     {
         new ConnectorViewModel { Title = "In" }
     },
     Location = new Point(200, 10)
 };
 Nodes.Add(welcome);
 Nodes.Add(node2);
 Nodes.Add(nodify);
 Connections.Add(new ConnectionViewModel(welcome.Output[0], nodify.Input[0]));

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

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

相关文章

FPGA实现TMDS编码

1.TMDS编码 TMDS&#xff08;Transition Minimized Differential Signaling&#xff09;&#xff0c;即最小化差分传输信号&#xff0c;在DVI&#xff08;数字视频接口&#xff0c;只能传输视频&#xff09;和HDMI&#xff08;音视频均可传输&#xff09;协议中用于传输音视频…

适用于 Windows 的典型 PDF 编辑器程序

尽管 PDF 文件已经存在了很长时间&#xff0c;但我们仍然希望使用此类文件完成一些任务。其中一项任务是在我们的计算机上编辑它们&#xff0c;尤其是 Windows。但是&#xff0c;考虑到 PDF 文件是复杂数据的集合&#xff0c;它不会那么简单。因此&#xff0c;您将需要第三方应…

5分钟就能搭建 AI 聊天室场景!内含源代码,码住了!

近期奥运会的赛事观看火爆全网&#xff0c;大家在赛事直播间的聊天更是异常活跃&#xff0c;小编作为一个非足球爱好者&#xff0c;经常对直播解说中的「专有名词」充满迷惑。这时候特别想有一个 AI 数字人帮忙解惑。 这里&#xff0c;我们就利用云信的 AI 数字人&#xff0c;…

GraphRAG + Ollama 本地部署全攻略:避坑实战指南

—1— 为什么要对 GraphRAG 本地部署&#xff1f; 微软开源 GraphRAG 后&#xff0c;热度越来越高&#xff0c;目前 GraphRAG 只支持 OpenAI 的闭源大模型&#xff0c;导致部署后使用范围大大受限&#xff0c;本文通过 GraphRAG 源码的修改&#xff0c;来支持更广泛的 Embedd…

springboot之项目搭建并say hi

写在前面 本文看下如何搭建一个最简单的支持http接口的hello程序。 1&#xff1a;正文 接着引入springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><v…

4.7重复的子字符串(LC_459-E)

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabcabcabc"…

无线终端ZWS云应用(一)—1分钟快速接入CATCOM-100 DTU上云

环境监测设备&#xff08;如温湿度传感器&#xff09;可以通过DTU终端CATCOM-100接入ZWS云平台&#xff0c;实现远程监控和管理。 准备工作 准备一个温湿度传感器和一个致远电子的DTU终端CATCOM-100。准备一张SIM卡&#xff0c;用于4G联网。 操作步骤 1. 云平台设备创建 1.1 …

PCIe563XD系列多功能异步数据采集卡64路AD信号采集500K采样频率

阿尔泰科技 型号&#xff1a;PCIe5630D/5631D/5632D/5633Dhttps://item.taobao.com/item.htm?spma1z10.3-c-s.w4002-265216876.12.84513350msbilC&id589158158140&piskf6qstfsYFCA6dK09z-BERdlfDjobG5szWKMYE-KwHcntcqeoOlla3juYGWce0OmNomNjOScZ7chwcmwbiSuY0jrXIkN…

nodejs发送邮件给多个收件人如何实现群发?

node.js发送邮件的方法&#xff1f;如何用nodejs自动发送邮件&#xff1f; Node.js发送邮件是一种高效而灵活的解决方案&#xff0c;尤其是在需要群发邮件时。AokSend将探讨如何使用Node.js发送邮件给多个收件人&#xff0c;帮您实现邮件的批量发送。 nodejs发送邮件&#xf…

2024年3款精选工具+谷歌翻译:发现那些你不知道的高级功能!

现在这世界变得越来越像一个村了&#xff0c;语言不应该是我们聊天的绊脚石。但是在工作的时候&#xff0c;碰到不同语言的文件、邮件和会议&#xff0c;翻译还是挺考验人的。好在有谷歌翻译这个牛气的工具&#xff0c;还有其他几个好用的软件帮忙&#xff0c;让我们在工作上翻…

前端常见**MS题 [3]

css部分 1、简单说明一下盒模型 CSS盒模型定义了盒的每个部分包含&#xff1a; margin, border, padding, content 。根据盒子大小的计算方式不同盒模型分成了两种&#xff0c;标准盒模型和怪异盒模型。 标准模型&#xff0c;给盒设置 width 和 height&#xff0c;实际设置的是…

【吊打面试官系列-Memcached面试题】memcached 的多线程是什么?如何使用它们?

大家好&#xff0c;我是锋哥。今天分享关于 【memcached 的多线程是什么&#xff1f;如何使用它们&#xff1f; 】面试题&#xff0c;希望对大家有帮助&#xff1b; memcached 的多线程是什么&#xff1f;如何使用它们&#xff1f; 线程就是定律&#xff08;threads rule&#…

linux 第一个命令的编写

1. 命令的概念 命令就是可执行程序。 比如说输入“ls -al”命令&#xff0c;ls 就是可执行程序的的名字。-al 就是要传递进去的参数。 ps 命令&#xff1a; 功能&#xff1a;显示进程的动态。 输入 ps 命令 当 shell 接收到命令以后&#xff0c;会根据输入的字符到环境变量和默…

UDP/TCP --- Socket编程

本篇将使用 Linux 中的系统调用来实现模拟 TCP 和 UDP 的通信过程&#xff0c;其中只对 UDP 和 TCP 进行了简单的介绍&#xff0c;本篇主要实现的是代码&#xff0c;至于 UDP 和 TCP 的详细讲解将会在之后的文章中给出。 本篇给出的 tcp 和 udp 的代码中的 echo 都是测试连接是…

电脑死机之后强制关机重启,只能进入到Bios,不能进入到系统?

前言 最近遇到好几件比较有意思的事情&#xff0c;粉丝过来求助咨询&#xff1a;电脑不知怎的就黑屏死机了&#xff0c;重启之后&#xff0c;电脑只能进入到Bios&#xff0c;无论怎么重启都没用。 把电脑拆出来看了看&#xff0c;线路一切正常。感觉上可能是内存条的问题&…

NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析

随着智能汽车的快速发展&#xff0c;车载语音交互技术逐渐成为提升驾驶体验的关键技术之一。传统的汽车内饰氛围灯语音识别系统往往依赖于手动操作&#xff0c;不仅操作繁琐&#xff0c;而且在驾驶过程中容易分散驾驶员的注意力。因此&#xff0c;开发一种高效、便捷的汽车内饰…

OpenAI gym: when is reset required?

题意&#xff1a;“OpenAI Gym: 什么时候需要重置&#xff1f;” 问题背景&#xff1a; Although I can manage to get the examples and my own code to run, I am more curious about the real semantics / expectations behind OpenAI gym API, in particular Env.reset() …

基于网格尺度的上海市人口分布空间聚集特征分析与冷热点识别

在上篇文章提到了同一研究空间在不同尺度下的观察可能会带来不同的见解和发现&#xff0c;这次我们把尺度缩放到网格&#xff0c;来看网格尺度下的空间自相关性、高/低聚类&#xff0c;这些&#xff0c;因为尺度缩放到网格尺度了&#xff0c;全国这个行政区范围就显的太大了&am…

Python采集网页数据:八招全解

在信息时代&#xff0c;海量的数据日益成为企业和个人获取商业价值的重要手段。而获取这些数据的方式之一就是通过网络爬虫技术采集网络上的各种信息&#xff0c;对于 Python 程序员来说&#xff0c;这项工作并不困难。本文将从八个方面&#xff0c;带你了解如何使用 Python 采…

查找技术与平衡查找树

目录 引言 查找技术的重要性 顺序查找 顺序查找的优缺点对比 二分查找 二分查找的步骤总结 哈希查找 哈希函数设计与冲突解决 平衡查找树 二叉搜索树、AVL树与红黑树 平衡查找树的插入与删除操作 平衡查找树的应用场景 总结与应用 综合实例分析 引言 查找是计算机…