Nodify學習 三:連接器

来源:https://www.cnblogs.com/zt199510/p/18310735
-Advertisement-
Play Games

前置 連接概述 連接是由兩個點之間創建的。Source和Target依賴屬性是Point類型,通常綁定到連接器的Anchor點。 基本連接 庫中所有連接的基類是BaseConnection,它派生自Shape。在創建自定義連接時,可以不受任何限值地從BaseConnection派生。 它公開了兩個命 ...


前置

連接概述

連接是由兩個點之間創建的。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)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1. 講故事 最新版本 1.2402.24001.0 的WinDbg真的讓人很興奮,可以將自己偽裝成 GDB 來和遠程的 GDBServer 打通來實現對 Linux 上 .NET程式進行調試,這樣就可以繼續使用熟悉的WinDbg 命令,在這個版本中我覺得 WinDbg 不再是 WinDb ...
  • 前置 預先連接 可以從連接器創建預先連接,並可以放置在ItemContainer或Connector上(如果AllowOnlyConnectors為false)。 預先連接的Content可以使用ContentTemplate進行自定義。如果EnablePreview為true,PreviewTar ...
  • 現如今大模型遍地都是,OpenAI的ChatGPT,Meta的Llama(羊駝),Anthropic的Claude,Microsoft的Phi3,Google的Gemini...... 怎麼都是國外的???嗯,國內也有,比如騰訊有混元大模型,位元組跳動有豆包大模型等等。 不過這不是今天的重點,這寫國內 ...
  • 前兩天發了一篇關於模式匹配的文章,鏈接地址,有小伙伴提到使用.NET6沒法體驗 C#新特性的疑問, 其實呢只要本地的SDK源代碼編譯器能支持到的情況下(直接下載VS2022或者VS的最新preview版本) 只需要做很小的改動就可以支持的. 目前仍然還有一些小伙伴因為歷史原因可能還在寫.NET Fr ...
  • 字元串轉換為數字int.TryParse() bool success = int.TryParse("300",out int b); Console.WriteLine(success); // 輸出為 true Console.WriteLine(b); //輸出為 300 字元串里的“300 ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • AutoFixture是一個.NET庫,旨在簡化單元測試中的數據設置過程。通過自動生成測試數據,它幫助開發者減少測試代碼的編寫量,使得單元測試更加簡潔、易讀和易維護。AutoFixture可以用於任何.NET測試框架,如xUnit、NUnit或MSTest。 預設情況下AutoFixture生成的字 ...
  • 閱讀了 https://devblogs.microsoft.com/dotnet/configureawait-faq/,感覺其對於 .NET 非同步編程有非常有意義的指導,對於進一步學習和理解 .NET 非同步編程非常友邦做,所以進行翻譯以供參考學習。 七年多前,.NET 在語言和庫中加入了 asy ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...