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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...