了解最新公司動態(tài)及行業(yè)資訊
大家好,我是沙漠盡頭的狼,今天介紹一個WPF開源項目-NodeNetwork,它可以幫助我們快速構(gòu)建和定制網(wǎng)絡(luò)拓?fù)鋱D。
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)可視化和可交互性越來越受到關(guān)注。為了實現(xiàn)這一點,通常需要使用各種圖表、表格、網(wǎng)絡(luò)拓?fù)鋱D等控件。然而,對于某些特殊的場景,這些控件可能無法滿足需求,此時我們需要一種自定義的方式來展示和處理數(shù)據(jù)。NodeNetwork就是一種這樣的自定義方式,它是一個基于C# WPF的開源項目,可以幫助我們快速構(gòu)建和定制網(wǎng)絡(luò)拓?fù)鋱D。
NodeNetwork的代碼托管在GitHub上,是由荷蘭的一位開發(fā)者Wouterdek所創(chuàng)建和維護的。在本文中,我們將對NodeNetwork進行介紹和分析,希望讀者能夠通過本文了解到NodeNetwork的核心概念、應(yīng)用場景和使用方法,同時也能夠掌握一些開發(fā)NodeNetwork的技巧和經(jīng)驗。
倉庫地址:https://github.com/Wouterdek/NodeNetwork
倉庫截圖:
倉庫源碼結(jié)構(gòu):
此示例允許用戶使用節(jié)點編輯器創(chuàng)建數(shù)學(xué)表達式。修改節(jié)點時,將自動計算和更新結(jié)果值。此應(yīng)用程序包含節(jié)點驗證,自定義節(jié)點子類,值輸入/輸出,自定義輸入編輯器,節(jié)點列表,...
下面是計算器示例[1]應(yīng)用程序的演示:
在此示例中,用戶可以創(chuàng)建 LUA 代碼。與虛幻引擎中的藍圖類似,編輯器具有執(zhí)行流程和數(shù)據(jù)流。自定義輸入/輸出端口、節(jié)點編輯器提供了更直觀的體驗。
下面是代碼生成器[2]應(yīng)用程序的截圖:
此庫更實用的示例可能是著色器編輯器。
下面是使用 NodeNetwork 制作的著色器編輯器[3]示例的演示:
這些示例應(yīng)用程序可在此處下載[4],其源代碼包含在存儲庫中,庫的二進制版本在 NuGet 上可用。
以下內(nèi)容可參考倉庫組件說明[6]頁。
節(jié)點是NodeNetwork中的最基本元素,可以表示任何一個數(shù)據(jù)源或處理單元。每個節(jié)點可以包含一個或多個輸入端口和輸出端口,分別表示節(jié)點接收和輸出的數(shù)據(jù)。NodeNetwork中內(nèi)置了幾種常用的節(jié)點類型,如常量節(jié)點、計算節(jié)點、輸入輸出節(jié)點等,同時也支持自定義節(jié)點類型。
連接是NodeNetwork中的一個核心概念,用于表示節(jié)點之間的數(shù)據(jù)傳輸關(guān)系。每個連接都有一個源端口和目標(biāo)端口,源端口表示數(shù)據(jù)的來源,目標(biāo)端口表示數(shù)據(jù)的目標(biāo)。連接還可以攜帶一些元數(shù)據(jù)(metadata),用于描述連接的一些附加信息,如顏色、線寬等。
端口是節(jié)點的輸入或輸出端點,用于與其他節(jié)點進行連接。每個端口都有一個類型,表示該端口所能接收或輸出的數(shù)據(jù)類型。端口還可以有一些其他屬性,如標(biāo)簽、描述等,用于描述端口的功能和作用。
NodeNetwork是基于WPF框架實現(xiàn)的,因此它具有一套強大的圖形界面(GUI)系統(tǒng)。在NodeNetwork中,每個節(jié)點和連接都可以顯示為一個圖形化的元素,用戶可以通過拖拽、縮放等方式對這些元素進行操作。
布局是NodeNetwork的另一個重要概念,用于控制節(jié)點和連接的位置和大小。NodeNetwork中提供了多種不同的布局方式,如自由布局、柵格布局、力導(dǎo)向布局等。用戶可以根據(jù)具體的需求選擇不同的布局方式,并且可以通過代碼或圖形界面進行布局的定制和調(diào)整。
在實際的應(yīng)用中,我們需要將節(jié)點和連接保存到文件或數(shù)據(jù)庫中,或者從文件或數(shù)據(jù)庫中讀取節(jié)點和連接。為了實現(xiàn)這一點,NodeNetwork提供了序列化和反序列化功能。序列化是將節(jié)點和連接轉(zhuǎn)換成一個數(shù)據(jù)流的過程,反序列化則是將數(shù)據(jù)流轉(zhuǎn)換成節(jié)點和連接的過程。NodeNetwork支持多種不同的序列化格式,如XML、JSON、二進制等,用戶可以根據(jù)具體需求選擇不同的格式。
NodeNetwork具有廣泛的應(yīng)用場景,下面介紹其中的幾個:
NodeNetwork可以幫助我們快速構(gòu)建數(shù)據(jù)處理和分析的工具。例如,我們可以創(chuàng)建一個圖形化的工作流,將不同的數(shù)據(jù)處理節(jié)點連接起來,從而實現(xiàn)數(shù)據(jù)的預(yù)處理、轉(zhuǎn)換和分析。
NodeNetwork可以幫助我們快速構(gòu)建圖形化的編輯器。例如,我們可以創(chuàng)建一個圖形化的界面,用于編輯和配置某些參數(shù)或選項,這些參數(shù)或選項可以通過節(jié)點和連接的方式進行交互和傳遞。
NodeNetwork可以幫助我們快速構(gòu)建可視化和交互式的展示工具。例如,我們可以創(chuàng)建一個圖形化的網(wǎng)絡(luò)拓?fù)鋱D,用于展示某些設(shè)備或系統(tǒng)的連接關(guān)系和狀態(tài)。用戶可以通過節(jié)點和連接的方式進行交互和控制,例如添加、刪除、修改節(jié)點和連接等。
NodeNetwork的使用方法非常簡單,下面介紹其中的幾個步驟(參考不到30行代碼的Hello world[7])。
首先,使用 Dotnet 8[8]創(chuàng)建WPF項目,項目命名為NodeNetworkTest,您可以使用 .NET Framework 4.7.2 以上或 .NET CORE 3.x 以上,站長使用 .NET 8只是8預(yù)覽版2剛出來試試而已。
NodeNetwork可以通過NuGet包管理器進行安裝。在Visual Studio中,打開“包管理器控制臺”,輸入以下命令即可安裝NodeNetwork:
Install-Package NodeNetwork
MVVM在整個NodeNetwork庫中都在貫徹使用。有關(guān)MVVM的介紹請點擊這里[9]查看。使用庫中的元素,您需要創(chuàng)建合適的視圖,并為其提供相應(yīng)的ViewModel實例。
在使用庫之前,請在App.xaml.cs文件的OnStartup方法內(nèi)使用NNViewRegistrar.RegisterSplat()方法將NodeNetwork的視圖和相應(yīng)的ViewModel進行注冊關(guān)聯(lián)。
usingSystem.Windows;
usingNodeNetwork;
namespace NodeNetworkTest;
public partial class App : Application{
protected override void OnStartup(StartupEventArgs e){
base.OnStartup(e);
NNViewRegistrar.RegisterSplat();
}
}
打開MainWindow.xaml,添加NodeNetwork命名空間xmlns:nodenetwork="clr-namespace:NodeNetwork.Views;assembly=NodeNetwork",并添加NetworkView視圖<nodenetwork:NetworkView x:Name="networkView" />,NetworkView表示整個網(wǎng)絡(luò)拓?fù)鋱D:
<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>在NodeNetwork中,創(chuàng)建節(jié)點和連接非常簡單。首先,我們需要創(chuàng)建NetworkViewModel,它是NetworkView視圖的ViewModel,可以通過以下代碼創(chuàng)建:
var network = newNetworkViewModel();
networkView.ViewModel = network;
然后通過以下代碼創(chuàng)建第一個節(jié)點:
var node1 = newNodeViewModel();
node1.Name = "節(jié)點1";
network.Nodes.Add(node1);
并給第一個節(jié)點創(chuàng)建一個輸入端口:
var node1Input = newNodeInputViewModel();
node1Input.Name = "節(jié)點1輸入";
node1.Inputs.Add(node1Input);
創(chuàng)建第二個節(jié)點,并以同樣的方式給此節(jié)點創(chuàng)建一個輸出端口:
var node2 = newNodeViewModel();
node2.Name = "節(jié)點2";
network.Nodes.Add(node2);
var node2Output = newNodeOutputViewModel();
node2Output.Name = "節(jié)點2輸出";
node2.Outputs.Add(node2Output);
最后,我們可以通過以下代碼將節(jié)點1的輸入端口和節(jié)點2的輸出端口連接到一起:
var connection = newConnectionViewModel(network, node1Input, node2Output);
network.Connections.Add(connection);
完整代碼如下:
usingDynamicData;
usingNodeNetwork.ViewModels;
usingSystem.Windows;
namespace NodeNetworkTest;
public partial class MainWindow : Window{
public MainWindow(){
InitializeComponent();
// 創(chuàng)建NetworkView視圖的ViewModel實例var network = newNetworkViewModel();
// 給視圖(networkView)賦值viewmodel(network)networkView.ViewModel = network;
// 創(chuàng)建第一個節(jié)點ViewModel,設(shè)置它的名稱并將此節(jié)點加入到networkvar node1 = newNodeViewModel();
node1.Name = "節(jié)點1";
network.Nodes.Add(node1);
// 創(chuàng)建第一個節(jié)點的輸入端口ViewModel,設(shè)置它的名稱并加入第一個節(jié)點var node1Input = newNodeInputViewModel();
node1Input.Name = "節(jié)點1輸入";
node1.Inputs.Add(node1Input);
// 創(chuàng)建第二個節(jié)點ViewModel,設(shè)置它的名稱并將此節(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 = newNodeViewModel();
node2.Name = "節(jié)點2";
network.Nodes.Add(node2);
var node2Output = newNodeOutputViewModel();
node2Output.Name = "節(jié)點2輸出";
node2.Outputs.Add(node2Output);
// 將節(jié)點1的輸入端口和節(jié)點2的輸出端口連接到一起var connection = newConnectionViewModel(network, node1Input, node2Output);
network.Connections.Add(connection);
}
}
運行程序看效果:
示例代碼已經(jīng)全部給了,你也可以戳這[10]克隆。
在NodeNetwork中,布局非常靈活和自由。我們可以通過代碼或圖形界面進行布局。例如,我們可以通過以下代碼將節(jié)點放置在指定的位置:
node.Position = new Point(100, 100);
通過以下代碼調(diào)整整個網(wǎng)絡(luò)拓?fù)鋱D的布局(參考布局文檔[11]):
ForceDirectedLayouter layouter = newForceDirectedLayouter();
var config = newConfiguration
{
Network = yourNetwork,
};
layouter.Layout(config, 10000);
在NodeNetwork中,序列化和反序列化非常簡單。我們可以通過以下代碼將節(jié)點和連接序列化為XML格式:
var serializer = new XmlSerializer(typeof(NodeNetworkViewModel));
var writer = newStringWriter();
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開源項目,它可以幫助我們快速構(gòu)建圖形化的網(wǎng)絡(luò)拓?fù)鋱D,實現(xiàn)節(jié)點和連接的交互和傳遞。NodeNetwork提供了豐富的功能和特性,例如節(jié)點和連接的自定義、布局和調(diào)整、序列化和反序列化等,可以滿足各種不同的應(yīng)用需求。NodeNetwork的應(yīng)用場景非常廣泛,例如數(shù)據(jù)處理和分析、圖形化編輯器、可視化和交互式展示等。NodeNetwork的使用方法非常簡單,我們只需要安裝NodeNetwork、創(chuàng)建節(jié)點和連接、布局和調(diào)整、序列化和反序列化即可。
入門指南有關(guān)使用此庫的簡單快速入門指南,請參閱此頁面[12]上的說明書章節(jié)。該文檔包括設(shè)置信息、說明書章節(jié)、示例和 API 參考。
許可證該庫在 Apache 許可證 2.0 下獲得許可。(見 choosealicense.com/licenses/apache-2.0[13] 簡要介紹)此許可證的副本包含在 LICENSE 下的存儲庫中。
文檔文檔可在此處[14]獲得。如果要對文檔進行更改,可以通過向 gh-pages 分支[15]發(fā)出拉取請求來實現(xiàn)。
貢獻這些操作在 GitHub 頁面上非常受歡迎:錯誤報告、補丁、功能請求、拉取請求...
微信技術(shù)交流群:添加微信(dotnet9com)備注“入群”QQ技術(shù)交流群:771992300。計算器示例: https://github.com/Wouterdek/NodeNetwork/tree/master/ExampleCalculatorApp
[2]代碼生成器: https://github.com/Wouterdek/NodeNetwork/tree/master/ExampleCodeGenApp
[3]著色器編輯器: https://github.com/Wouterdek/NodeNetwork/tree/master/ExampleShaderEditorApp
[4]下載: https://github.com/Wouterdek/NodeNetwork/releases
[5]Apache-2.0 license: https://github.com/Wouterdek/NodeNetwork/blob/master/LICENSE
[6]組件說明: https://wouterdek.me/NodeNetwork/components
[7]不到30行代碼的Hello world: https://wouterdek.me/NodeNetwork/cookbook/hello_world
[8]Dotnet 8: https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0
[9]這里: https://www.codeproject.com/Articles/100175/Model-View-ViewModel-MVVM-Explained
[10]戳這: https://github.com/dotnet9/TerminalMACS.ManagerForWPF/tree/master/src/Demo/NodeNetworkTest
[11]布局文檔: https://wouterdek.me/NodeNetwork/cookbook/layout
[12]此頁面: https://wouterdek.github.io/NodeNetwork/doc
[13]choosealicense.com/licenses/apache-2.0: https://choosealicense.com/licenses/apache-2.0
[14]此處: https://wouterdek.github.io/NodeNetwork/doc
[15]gh-pages 分支: https://github.com/Wouterdek/NodeNetwork/tree/gh-pages