能快速構建和定制網絡拓撲圖的WPF開源項目-NodeNetwork

大家好,我是沙漠盡頭的狼,今天介紹一個WPF開源項目-NodeNetwork,它可以幫助我們快速構建和定制網絡拓撲圖。

一、前言

在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)可視化和可交互性越來越受到關注。為了實現(xiàn)這一點,通常需要使用各種圖表、表格、網絡拓撲圖等控件。然而,對于某些特殊的場景,這些控件可能無法滿足需求,此時我們需要一種自定義的方式來展示和處理數(shù)據(jù)。NodeNetwork就是一種這樣的自定義方式,它是一個基于C# WPF的開源項目,可以幫助我們快速構建和定制網絡拓撲圖。

NodeNetwork的代碼托管在GitHub上,是由荷蘭的一位開發(fā)者Wouterdek所創(chuàng)建和維護的。在本文中,我們將對NodeNetwork進行介紹和分析,希望讀者能夠通過本文了解到NodeNetwork的核心概念、應用場景和使用方法,同時也能夠掌握一些開發(fā)NodeNetwork的技巧和經驗。

倉庫地址:https://github.com/Wouterdek/NodeNetwork

倉庫截圖:

1201.png

倉庫源碼結構:

1209.png

二、示例

1. 計算器示例

此示例允許用戶使用節(jié)點編輯器創(chuàng)建數(shù)學表達式。 修改節(jié)點時,將自動計算和更新結果值。 此應用程序包含節(jié)點驗證,自定義節(jié)點子類,值輸入/輸出,自定義輸入編輯器,節(jié)點列表,...

下面是計算器示例應用程序的演示:

1202.gif

2. 代碼生成器示例

在此示例中,用戶可以創(chuàng)建 LUA 代碼。與虛幻引擎中的藍圖類似,編輯器具有執(zhí)行流程和數(shù)據(jù)流。 自定義輸入/輸出端口、節(jié)點編輯器提供了更直觀的體驗。

下面是代碼生成器應用程序的截圖:

1204.gif

3. 著色器編輯器示例

此庫更實用的示例可能是著色器編輯器。

下面是使用 NodeNetwork 制作的著色器編輯器示例的演示:

1203.gif

這些示例應用程序可在此處下載,其源代碼包含在存儲庫中,庫的二進制版本在 NuGet 上可用。

三、特征

  1. 專為 .NET Framework 4.7.2 和 .NET Core 3.1 或更高版本構建。
  2. 開放、寬松的許可證-Apache-2.0 license
  3. 使用現(xiàn)代反應式 MVVM 代碼構建的交互式、可靠的控件。
  4. 順滑的平移、縮放控件。
  5. 自動布局系統(tǒng)。
  6. 高度可定制,但默認情況下易于使用。
  7. 強大的節(jié)點和連接驗證支持。
  8. 大量的單元測試提供支持。
  9. ...

四、NodeNetwork的核心概念

以下內容可參考倉庫組件說明頁。

1. 節(jié)點(Node)

節(jié)點是NodeNetwork中的最基本元素,可以表示任何一個數(shù)據(jù)源或處理單元。每個節(jié)點可以包含一個或多個輸入端口和輸出端口,分別表示節(jié)點接收和輸出的數(shù)據(jù)。NodeNetwork中內置了幾種常用的節(jié)點類型,如常量節(jié)點、計算節(jié)點、輸入輸出節(jié)點等,同時也支持自定義節(jié)點類型。

1205.png

2. 連接(Connection)

連接是NodeNetwork中的一個核心概念,用于表示節(jié)點之間的數(shù)據(jù)傳輸關系。每個連接都有一個源端口和目標端口,源端口表示數(shù)據(jù)的來源,目標端口表示數(shù)據(jù)的目標。連接還可以攜帶一些元數(shù)據(jù)(metadata),用于描述連接的一些附加信息,如顏色、線寬等。

1206.png

3. 端口(Port)

端口是節(jié)點的輸入或輸出端點,用于與其他節(jié)點進行連接。每個端口都有一個類型,表示該端口所能接收或輸出的數(shù)據(jù)類型。端口還可以有一些其他屬性,如標簽、描述等,用于描述端口的功能和作用。

4. 圖形界面(GUI)

NodeNetwork是基于WPF框架實現(xiàn)的,因此它具有一套強大的圖形界面(GUI)系統(tǒng)。在NodeNetwork中,每個節(jié)點和連接都可以顯示為一個圖形化的元素,用戶可以通過拖拽、縮放等方式對這些元素進行操作。

5. 布局(Layout)

布局是NodeNetwork的另一個重要概念,用于控制節(jié)點和連接的位置和大小。NodeNetwork中提供了多種不同的布局方式,如自由布局、柵格布局、力導向布局等。用戶可以根據(jù)具體的需求選擇不同的布局方式,并且可以通過代碼或圖形界面進行布局的定制和調整。

6. 序列化和反序列化(Serialization and Deserialization)

在實際的應用中,我們需要將節(jié)點和連接保存到文件或數(shù)據(jù)庫中,或者從文件或數(shù)據(jù)庫中讀取節(jié)點和連接。為了實現(xiàn)這一點,NodeNetwork提供了序列化和反序列化功能。序列化是將節(jié)點和連接轉換成一個數(shù)據(jù)流的過程,反序列化則是將數(shù)據(jù)流轉換成節(jié)點和連接的過程。NodeNetwork支持多種不同的序列化格式,如XML、JSON、二進制等,用戶可以根據(jù)具體需求選擇不同的格式。

五、NodeNetwork的應用場景

NodeNetwork具有廣泛的應用場景,下面介紹其中的幾個:

1. 數(shù)據(jù)處理和分析

NodeNetwork可以幫助我們快速構建數(shù)據(jù)處理和分析的工具。例如,我們可以創(chuàng)建一個圖形化的工作流,將不同的數(shù)據(jù)處理節(jié)點連接起來,從而實現(xiàn)數(shù)據(jù)的預處理、轉換和分析。

2. 圖形化編輯器

NodeNetwork可以幫助我們快速構建圖形化的編輯器。例如,我們可以創(chuàng)建一個圖形化的界面,用于編輯和配置某些參數(shù)或選項,這些參數(shù)或選項可以通過節(jié)點和連接的方式進行交互和傳遞。

3. 可視化和交互式展示

NodeNetwork可以幫助我們快速構建可視化和交互式的展示工具。例如,我們可以創(chuàng)建一個圖形化的網絡拓撲圖,用于展示某些設備或系統(tǒng)的連接關系和狀態(tài)。用戶可以通過節(jié)點和連接的方式進行交互和控制,例如添加、刪除、修改節(jié)點和連接等。

六、NodeNetwork的使用方法

NodeNetwork的使用方法非常簡單,下面介紹其中的幾個步驟(參考不到30行代碼的Hello world)。

首先,使用 Dotnet 8創(chuàng)建WPF項目,項目命名為NodeNetworkTest,您可以使用 .NET Framework 4.7.2 以上或 .NET CORE 3.x 以上,站長使用 .NET 8只是8預覽版2剛出來試試而已。

1. 安裝NodeNetwork

NodeNetwork可以通過NuGet包管理器進行安裝。在Visual Studio中,打開“包管理器控制臺”,輸入以下命令即可安裝NodeNetwork:

Install-Package NodeNetwork

2. 注冊NodeNetwork視圖

MVVM在整個NodeNetwork庫中都在貫徹使用。有關MVVM的介紹請點擊這里查看。使用庫中的元素,您需要創(chuàng)建合適的視圖,并為其提供相應的ViewModel實例。

在使用庫之前,請在App.xaml.cs文件的OnStartup方法內使用NNViewRegistrar.RegisterSplat()方法將NodeNetwork的視圖和相應的ViewModel進行注冊關聯(lián)。

using System.Windows;
using NodeNetwork;

namespace NodeNetworkTest;

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        NNViewRegistrar.RegisterSplat();
    }
}

3. 創(chuàng)建視圖

打開MainWindow.xaml,添加NodeNetwork命名空間xmlns:nodenetwork="clr-namespace:NodeNetwork.Views;assembly=NodeNetwork",并添加NetworkView視圖<nodenetwork:NetworkView x:Name="networkView" />,NetworkView表示整個網絡拓撲圖:

<Window x:Class="NodeNetworkTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:nodenetwork="clr-namespace:NodeNetwork.Views;assembly=NodeNetwork"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <nodenetwork:NetworkView x:Name="networkView" />
    </Grid>
</Window>

4. 創(chuàng)建節(jié)點和連接

在NodeNetwork中,創(chuàng)建節(jié)點和連接非常簡單。首先,我們需要創(chuàng)建NetworkViewModel,它是NetworkView視圖的ViewModel,可以通過以下代碼創(chuàng)建:

var network = new NetworkViewModel();
networkView.ViewModel = network;

然后通過以下代碼創(chuàng)建第一個節(jié)點:

var node1 = new NodeViewModel();
node1.Name = "節(jié)點1";
network.Nodes.Add(node1);

并給第一個節(jié)點創(chuàng)建一個輸入端口:

var node1Input = new NodeInputViewModel();
node1Input.Name = "節(jié)點1輸入";
node1.Inputs.Add(node1Input);

創(chuàng)建第二個節(jié)點,并以同樣的方式給此節(jié)點創(chuàng)建一個輸出端口:

var node2 = new NodeViewModel();
node2.Name = "節(jié)點2";
network.Nodes.Add(node2);

var node2Output = new NodeOutputViewModel();
node2Output.Name = "節(jié)點2輸出";
node2.Outputs.Add(node2Output);

最后,我們可以通過以下代碼將節(jié)點1的輸入端口和節(jié)點2的輸出端口連接到一起:

var connection = new ConnectionViewModel(network, node1Input, node2Output);
network.Connections.Add(connection);

完整代碼如下:

using DynamicData;
using NodeNetwork.ViewModels;
using System.Windows;

namespace NodeNetworkTest;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 創(chuàng)建NetworkView視圖的ViewModel實例
        var network = new NetworkViewModel();

        // 給視圖(networkView)賦值viewmodel(network)
        networkView.ViewModel = network;

        // 創(chuàng)建第一個節(jié)點ViewModel,設置它的名稱并將此節(jié)點加入到network
        var node1 = new NodeViewModel();
        node1.Name = "節(jié)點1";
        network.Nodes.Add(node1);

        // 創(chuàng)建第一個節(jié)點的輸入端口ViewModel,設置它的名稱并加入第一個節(jié)點
        var node1Input = new NodeInputViewModel();
        node1Input.Name = "節(jié)點1輸入";
        node1.Inputs.Add(node1Input);

        // 創(chuàng)建第二個節(jié)點ViewModel,設置它的名稱并將此節(jié)點加入到network, 并以同樣的方式給此節(jié)點添加一個輸出Create the second node viewmodel, set its name, add it to the network and add an output in a similar fashion.
        var node2 = new NodeViewModel();
        node2.Name = "節(jié)點2";
        network.Nodes.Add(node2);

        var node2Output = new NodeOutputViewModel();
        node2Output.Name = "節(jié)點2輸出";
        node2.Outputs.Add(node2Output);

        // 將節(jié)點1的輸入端口和節(jié)點2的輸出端口連接到一起
        var connection = new ConnectionViewModel(network, node1Input, node2Output);
        network.Connections.Add(connection);
    }
}

運行程序看效果:

1207.gif

示例代碼已經全部給了,你也可以戳這克隆。

5. 布局

在NodeNetwork中,布局非常靈活和自由。我們可以通過代碼或圖形界面進行布局。例如,我們可以通過以下代碼將節(jié)點放置在指定的位置:

node.Position = new Point(100, 100);

通過以下代碼調整整個網絡拓撲圖的布局(參考布局文檔):

ForceDirectedLayouter layouter = new ForceDirectedLayouter();
var config = new Configuration
{
    Network = yourNetwork,
};
layouter.Layout(config, 10000);
1208.gif

6. 序列化和反序列化

在NodeNetwork中,序列化和反序列化非常簡單。我們可以通過以下代碼將節(jié)點和連接序列化為XML格式:

var serializer = new XmlSerializer(typeof(NodeNetworkViewModel));
var writer = new StringWriter();
serializer.Serialize(writer, nodeNetwork);

然后,我們可以將XML字符串保存到文件或數(shù)據(jù)庫中。反序列化也非常簡單。我們可以通過以下代碼從XML字符串中反序列化節(jié)點和連接:

var serializer = new XmlSerializer(typeof(NodeNetworkViewModel));
var reader = new StringReader(xmlString);
var nodeNetwork = (NodeNetworkViewModel)serializer.Deserialize(reader);

七、總結

NodeNetwork是一個非常實用和靈活的C# WPF開源項目,它可以幫助我們快速構建圖形化的網絡拓撲圖,實現(xiàn)節(jié)點和連接的交互和傳遞。NodeNetwork提供了豐富的功能和特性,例如節(jié)點和連接的自定義、布局和調整、序列化和反序列化等,可以滿足各種不同的應用需求。NodeNetwork的應用場景非常廣泛,例如數(shù)據(jù)處理和分析、圖形化編輯器、可視化和交互式展示等。NodeNetwork的使用方法非常簡單,我們只需要安裝NodeNetwork、創(chuàng)建節(jié)點和連接、布局和調整、序列化和反序列化即可。

  • 入門指南

有關使用此庫的簡單快速入門指南,請參閱此頁面上的說明書章節(jié)。 該文檔包括設置信息、說明書章節(jié)、示例和 API 參考。

  • 許可證

該庫在 Apache 許可證 2.0 下獲得許可。(見 choosealicense.com/licenses/apache-2.0 簡要介紹)此許可證的副本包含在 LICENSE 下的存儲庫中。

  • 文檔

文檔可在此處獲得。如果要對文檔進行更改,可以通過向 gh-pages 分支發(fā)出拉取請求來實現(xiàn)。

  • 貢獻

這些操作在 GitHub 頁面上非常受歡迎:錯誤報告、補丁、功能請求、拉取請求...

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容