首页 > 其他分享 >Nodify学习 三:连接器

Nodify学习 三:连接器

时间:2024-07-19 09:40:14浏览次数:12  
标签:ObservableCollection Nodify public 学习 连接器 new ConnectorViewModel 连接

前置

连接概述

连接是由两个点之间创建的。SourceTarget依赖属性是Point类型,通常绑定到连接器的Anchor点。

基本连接

库中所有连接的基类是BaseConnection,它派生自Shape。在创建自定义连接时,可以不受任何限值地从BaseConnection派生。

它公开了两个命令及其对应的事件:

  • DisconnectCommand 及 DisconnectEvent - 当按住ALT点击连接时触发
  • SplitCommand 及 SplitEvent - 当双击连接时触发

Nodify 控件支持 Input 和 Output 连接器,您可以通过重写 InputConnectorTemplate 和 OutputConnectorTemplate 的默认模板来自定义这些连接器

Direction 的连接可以有两个值:

  • Forward

 

  • Backward

 

和 SourceOffset 与 TargetOffset 锚点一起工作 OffsetMode ,并将与锚点保持距离:

连接也有一个 Spacing ,它将使连接在距 Source 和 Target 点一定距离处断开角度:

  • With spacing: 带间距:

 

  • Without spacing: 无间距:

 设置为 ArrowSize “0,0”将删除箭头。

连接样式

Nodify 自带3个连接器样式

  • Line connection 直线连接

  • Circuit connection 电路连接

  • Connection 贝塞尔曲线连接

Line connection 直线连接

从 Source 到 Target 的直线。

Circuit connection 电路连接

具有 Angle 依赖项属性,用于控制其中断位置。角度以度为单位。

 

Connection 贝塞尔曲线连接

和 Target 之间的 Source 贝塞尔曲线。

 

操作

我们先创建一个NotifyPropertyBase类 作为消息通知的基类 

public class NotifyPropertyBase : INotifyPropertyChanged 
{ public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged([CallerMemberName] string propName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } public void Set<T>(ref T field, T value, Action action = null, [CallerMemberName] string propName = "") { if (EqualityComparer<T>.Default.Equals(field, value)) return; field = value; RaisePropertyChanged(propName); action?.Invoke(); } }

 

然后我们创建连接器类ConnectionViewModel  管理连接源和目标源

 

public class ConnectionViewModel
{
    public ConnectionViewModel(ConnectorViewModel source, ConnectorViewModel target)
    {
        Source = source;
        Target = target;

        Source.IsConnected = true;
        Target.IsConnected = true;
    }

    public ConnectorViewModel Source { get; }
    public ConnectorViewModel Target { get; }
}

在EditorViewModel 类添加

public ObservableCollection<ConnectionViewModel> Connections { get; } = new ObservableCollection<ConnectionViewModel>();

调整ConnectorViewModel的属性

    public class ConnectorViewModel: NotifyPropertyBase
    {
        public string Title { get; set; }

        private Point _anchor;
        public Point Anchor
        {
            get => _anchor;
            set => Set(ref _anchor, value);
        }

        private bool _isConnected;
        public bool IsConnected
        {
            get => _isConnected;
            set => Set(ref _isConnected, value);
        }
    }

在编辑器添加连接器样式

  <nodify:NodifyEditor
      x:Name="Editor"
      Background="{StaticResource GridDrawingBrush}"
      Connections="{Binding Connections}"
      ItemsSource="{Binding Nodes}">
      <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:NodeOutput
                              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 mod:ConnectionViewModel}">
              <nodify:Connection
                  Source="{Binding Source.Anchor}"
                  SourceOffsetMode="Rectangle"
                  Target="{Binding Target.Anchor}"
                  TargetOffsetMode="Rectangle" />
          </DataTemplate>
      </nodify:NodifyEditor.ConnectionTemplate>
  </nodify:NodifyEditor>

然后添加一个新的节点看看 连接效果 这里我用了的

Connection连接样式
public class EditorViewModel
{
    public ObservableCollection<NodeViewModel> Nodes { get; } = new ObservableCollection<NodeViewModel>();
    public ObservableCollection<ConnectionViewModel> Connections { get; } = new ObservableCollection<ConnectionViewModel>();
    public EditorViewModel()
    {
        var welcome = 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);


        Connections.Add(new ConnectionViewModel(welcome.Output[0], nodify.Input[0]));
       
    }
}

 

源码

github:zt199510/NodifySamples (github.com)

 

标签:ObservableCollection,Nodify,public,学习,连接器,new,ConnectorViewModel,连接
From: https://www.cnblogs.com/zt199510/p/18310735

相关文章

  • 计算机毕业设计Python+Tensorflow小说推荐系统 K-means聚类推荐算法 深度学习 Kears
    2、基于物品协同过滤推荐算法2.1、基于⽤户的协同过滤算法(UserCF)该算法利⽤⽤户之间的相似性来推荐⽤户感兴趣的信息,个⼈通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的⽬的进⽽帮助别⼈筛选信息,回应不⼀定局限于特别感兴趣的,特别不感兴趣信息的纪录也相......
  • 计算机毕业设计PySpark+Django高考志愿填报推荐系统 高考预测 高考大数据分析 Hadoop
    摘要本文旨在设计与实现一个基于Spark的高考志愿填报推荐系统,旨在帮助高考生根据自身成绩和兴趣,精准推荐合适的大学和专业。系统采用大数据处理框架Spark,结合机器学习算法,实现了对高考数据的深度挖掘和分析,为考生提供科学、有效的志愿填报建议。系统捕捉考生个人特征、......
  • 深度学习中的正则化技术 - Dropout篇
    序言在深度学习的浩瀚领域中,模型过拟合一直是研究者们面临的挑战之一。当模型在训练集上表现得近乎完美,却难以在未见过的数据(测试集)上保持同样优异的性能时,过拟合现象便悄然发生。为了有效缓解这一问题,Dropout......
  • k8s学习--pod的所有状态详解(图例展示)
    在Kubernetes中,Pod是最小的可部署计算单元。Pod有多种状态,每种状态都反映了Pod的生命周期的不同阶段。以下是Pod的所有状态及其详细解释:状态转换示意图1.Pending描述:Pod被创建并通过了调度器,但还没有绑定到任何节点,也可能容器镜像还在下载中。原因:没有足够......
  • [强化学习]--悬崖漫步
    Q-Learning是一种在强化学习中广泛应用的算法,它属于值迭代方法的一种,能够通过与环境交互来学习最优策略。Q-Learning的核心思想是学习一个动作价值函数(Q-Function),这个函数可以预测从某个状态采取某个动作后所能获得的长期奖励。1、Q-Learning的基本原理Q-Learning的目标是找......
  • 苍穹外卖学习笔记——第九天
    用户端历史订单模块查询历史订单需求分析和设计产品原型业务功能分页查询历史订单。可以根据订单状态查询(全部订单、待付款、已取消)。订单按照下单时间倒序排列。展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片)。接口设计......
  • 学习Go的第二天
    加完班回到家,继续第二天的学习,先尝试了解下常量,常量使用关键字const定义,用于存储不会改变的数据。故意尝试修改下常量:IDE提示:cannotassigntoPi(neitheraddressablenoramapindexexpression),即:无法分配给pi(既不是可寻址的,也不是映射索引表达式)iota特殊常量可以用......
  • 苍穹外卖学习笔记——第七天
    缓存商品、购物车缓存菜品问题说明用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大,从而导致系统响应慢、用户体验差。实现思路通过Redis来缓存菜品数据,减少数据库查询操作,具体流程如下:缓存逻辑分析:每个分类下的菜品......
  • 苍穹外卖学习笔记——第八天
    用户下单、订单支付导入地址簿功能代码需求分析和设计产品原型业务功能查询地址列表新增地址修改地址删除地址设置默认地址查询默认地址接口设计新增地址查询当前登录用户的所有地址信息查询默认地址根据id修改地址根据id删除地址根据id查询......
  • 大数据学习之SparkSQL(补充)
    SparkSQL1、SparkSql初识案例:WordCountsparksql处理数据的步骤1、读取数据源2、将读取到的DF注册成一个临时视图3、使用sparkSession的sql函数,编写sql语句操作临时视图,返回的依旧是一个DataFrame4、将结果写出到hdfs上importorg.apache.spark.SparkContextimport......