首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Visual Studio DSL 入門(6):DSL 圖形表示核心元素詳解

     編輯:關於.NET

前言:DSL 設計器的視覺化骨架

在 Visual Studio DSL Tools 中,定義領域模型只是第一步;要讓模型在設計介面上「可視、可編輯、可互動」,必須定義圖形表示。本文以 LanguageSm 專案為例,深入剖析 DSL 定義介面右側「泳道」區域的五大核心圖形元素:圖表、編輯器、形狀、連接器、泳道。

一、圖表:設計介面的根容器

DSL 定義介面泳道區域

LanguageSmDiagram 是圖表元素,屬性如下:

圖表屬性視窗

  • 角色:儲存形狀與連接器映射的容器,代表設計介面本身
  • 模型映射:對應領域模型的根域類(例:ExampleModel)
  • 生成產物:T4 模板依據屬性生成 Diagram 類別(位於 GeneratedCode 資料夾)
  • 可擴展性:可透過 partial 類別擴展,實現自訂背景、網格、縮放、概覽視窗等
  • 關鍵屬性分類:
    • 外觀:背景色、網格顯示、縮放範圍
    • 代碼:命名空間、存取修飾詞、基類
    • 文檔:工具提示、說明文字
    • 公開樣式屬性:暴露給屬性視窗的樣式屬性
    • 資源:圖示、圖片資源

若需完全自訂圖形化介面(非標準 DSL 設計器),必須實現自己的 Diagram 類別。

二、編輯器:VS 整合的進入點

編輯器定義位於 DSL Explorer 的「編輯器」節點,分兩類:

  • 設計器:圖形化設計介面(預設)
  • 自定義編輯器:非圖形化編輯體驗(如表格、文字編輯器)

預設設計器屬性

關鍵屬性:

  • 對應圖表元素
  • 編輯器 GUID(VS 擴展性系統識別用)
  • 根域類
  • 檔案副檔名(如 .languagesm)
  • 檔案關聯圖示

這些屬性用於生成 EditorFactory 類別、工具箱註冊、檔案關聯等 VS 整合機制。可刪除預設設計器,在根節點右鍵「添加自定義編輯器」實現完全自訂編輯體驗(需自行實現 DocView)。

添加自定義編輯器

三、形狀:模型元素的視覺化投影

形狀是 DSL 圖形符號的核心,與模型元素一一對應,使模型元素形象化。工具箱提供五種形狀類型,拖曳至圖形區即可創建:

1. 幾何形狀

幾何形狀模型與運行時

  • 基本形狀:矩形、橢圓、菱形等
  • 文本裝飾器:NameDecorator 控制形狀內文本顯示(內容、位置、字體、對齊)
  • 可添加裝飾器:
    • IconDecorator:顯示圖示
    • ExpandCollapseDecorator:展開/收合狀態

文本裝飾器屬性

2. 隔間形狀

隔間形狀

  • 帶有多個隔間的幾何形狀(如 UML 類別圖:名稱/屬性/方法三隔間)
  • 每個隔間可獨立映射領域模型集合屬性
  • 同樣支援文本、圖示、展開收合裝飾器

3. 圖像形狀

圖像形狀

  • 顯示位圖而非幾何輪廓
  • 可定義多種狀態對應不同圖像(預設、選中、禁用等)
  • 屬性中指定圖示資源

圖像形狀屬性

4. 連接埠形狀

連接埠形狀

  • 依附於父形狀輪廓,僅能沿輪廓移動的特殊形狀
  • 用於表示連接點(如電路圖腳位、流程圖連接點)
  • 除位置限制外,行為同幾何形狀

5. 泳道

泳道狀態流程圖

  • 將圖表劃分為行或列的區域容器
  • 常用於 BPMN、跨職能流程圖、時序圖
  • 來源:https://lonely7345.cnblogs.com/

四、連接器:關係的視覺化

雖本文重點在形狀,但連接器是圖形化 DSL 的另一半:

  • 映射領域關係(引用、嵌入)
  • 支援路由演算法(直線、正交、曲線)
  • 源/目標裝飾器(箭頭、菱形、角色名)
  • 標籤裝飾器(關係名稱、多重性)

五、圖形映射:模型與視圖的紐帶

在 DSL 定義中,必須建立 圖形映射:

  1. 選中圖表元素
  2. 在「圖形映射」屬性中添加映射規則
  3. 每條規則:域類別 → 形狀類別
  4. 例如:ExampleElement → ExampleShape

這使得:

  • 模型新增元素 → 自動創建對應形狀
  • 形狀拖曳移動 → 更新模型位置屬性
  • 形狀刪除 → 刪除模型元素(視嵌入關係而定)

實戰建議與常見坑點

  1. 形狀與模型 1:1 原則:一個域類別映射一個形狀類別;需不同視覺表示時,用繼承或裝飾器區分
  2. 裝飾器綁定:文本裝飾器的 DisplayProperty 需正確綁定域屬性,支援自訂格式化
  3. 工具箱自動填入:定義形狀後,重建專案,工具箱會自動出現對應項目
  4. 圖表擴展點:OnLayoutChanged、OnChildAdded 等虛擬方法可攔截佈局變更
  5. 效能考量:大量形狀時,考慮虛擬化、分層渲染、延遲載入

總結

DSL 圖形表示系統以「圖表為根、編輯器為入口、形狀為元素投影、連接器為關係投影、泳道為區域容器」構成完整視覺化編輯體驗。掌握五種形狀類型的特性與適用場景,正確配置裝飾器與映射,是構建專業級 DSL 設計器的關鍵。下一篇將深入連接器定義與佈局演算法客製化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved