自訂工具和工具箱

您必須定義您想要讓使用者新增至他們的模型項目的工具箱項目。有兩種工具: 項目工具和連線工具。在產生的設計工具中,使用者可以選取元素] 工具,將圖形拖曳到圖表中,並可以選取 [連接] 工具繪製圖形之間的連結。一般情況下,項目工具可讓使用者將網域類別的執行個體加入至他們的模型,以及連線工具可讓使用者新增網域關聯性的例項。

本主題內容:

  • 修改 [工具箱] 索引標籤

  • 項目工具

  • 從一種工具中建立項目群組

  • 連線工具

  • 變更工具箱項目的順序

工具箱] 中定義的方式

在 DSL 總管] 中,展開 [編輯器] 節點和其下的節點。通常您會看到一個層次,將會與下列相似:

Editor
     Toobox Tabs
        MyDsl          //a tab
           Tools
               ExampleElement      // an element tool
               ExampleRelationship // a connection tool

在這部分的 DSL 檔案總管中,您可以:

  • 建立新的索引標籤。索引標籤定義在工具箱] 的區段標題。

  • 建立新的工具。

  • 複製並貼上工具。

  • 將清單中上移上移或下移的工具。

  • 刪除索引標籤和工具。

重要事項重要事項

若要新增或 DSL 總管] 中貼上項目,以滑鼠右鍵按一下新節點的祖父系。例如,若要新增一種工具,標籤上按右鍵,並不工具節點。若要新增定位點,以滑鼠右鍵按一下編輯器節點。

工具箱圖示的每個工具的屬性參考是 16 x 16 點陣圖檔。這些檔案通常會保存在Dsl\Resources資料夾。

類別屬性的項目工具指的是具體的網域類別。預設情況下,工具會建立這個類別的執行個體。不過,您可以撰寫程式碼,希望這項工具建立的項目或型別不同的項目群組。

連接產生器的 [連接] 工具的屬性是指連接產生器 」,其中定義工具可以連接何種類型的項目,以及它們之間建立何種關聯性。連接產生器會定義為 DSL 總管] 中的節點。當您定義網域關係,但是您可以撰寫自訂它們的程式碼時,會自動建立連接產生器。

若要加入工具箱] 中的一種工具

  1. 建立圖形的類別,並對應至網域類別之後,通常會建立項目的工具。

    建立連接器類別及它對應至參考關聯性之後,通常會建立連接器] 工具。

  2. 在 DSL 總管] 中,展開編輯器 節點和 工具箱] 索引標籤節點。

    以滑鼠右鍵按一下 [工具箱] 索引標籤] 節點,然後按一下 加入新項目工具加入新的連線工具

  3. 設定工具箱圖示屬性,以參照為 16 x 16 點陣圖。

    如果您想要定義新的圖示,請在 [方案總管中建立點陣圖檔案Dsl\Resources資料夾。檔案應該具有下列屬性值: 建置動作 = 內容複製到輸出目錄 = 不會複製

  4. 項目工具: 設定類別的工具,來參考對應至圖形的具體的網域類別的屬性。

    連接器工具: 設定連接產生器工具的其中一個項目提供下拉式清單中的屬性。當您對應至網域關聯性的連接器,會自動建立連接產生器。如果您最近已建立連接器,您通常會選取相關聯的連接產生器。

  5. 若要測試的 DSL,請按下 F5 或 CTRL + F5,實驗性質的執行個體中,並Visual Studio,開啟範例模型檔案。新的工具應該會出現在工具箱] 中。請將它拖曳至圖表中,以確認它會建立新的項目。

    如果工具] 沒有出現,則到此為止實驗Visual Studio。在 [Windows 開始 功能表中,執行 重設執行 Microsoft Visual Studio 2010年實驗個體。在Visual Studio建置] 功能表中,按一下 重建方案。然後再次測試 DSL。

自訂項目工具

根據預設,此工具會建立一個指定的類別執行個體,但則可以區分這兩種方式:

  • 在項目合併的指示詞上定義其他的類別,讓他們接受這個類別的新執行個體,並讓他們能夠建立其他連結,當您建立新的項目時。例如,可以讓使用者拖放到另一個項目,註解,以建立兩者間的參考連結。

    這些自訂項目也會影響使用者貼上或拖曳,且會捨棄項目時,會發生什麼事。

    如需詳細資訊,請參閱 自訂項目的建立和移動

  • 撰寫自訂的工具,這樣才可以建立項目群組的程式碼。您可以覆寫的 ToolboxHelper.cs 中的方法初始化工具。如需詳細資訊,請參閱建立群組的元素] 工具從。

Bb126279.collapse_all(zh-tw,VS.110).gif從一種工具中建立項目群組

每個項目工具包含項目,會建立的原型。預設情況下,每個項目工具建立單一項目,但也可使用來建立一組相關物件的一種工具。若要這樣做,您可以初始化工具使用ElementGroupPrototype ,包含相關的項目。

下列範例取自的 DSL,裡面有是電晶體的類型。每個電晶體有三個已命名的終端機。電晶體的項目工具會儲存原型包含四個的模型項目和三個關聯性連結。當使用者拖曳至圖表上的工具時,原型會具現化,並連結到模型的根。

這段程式碼覆寫方法中定義的Dsl\GeneratedCode\ToolboxHelper.cs

如需有關如何使用程式碼來自訂此模型的詳細資訊,請參閱巡覽及更新程式碼中的模型

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

  public partial class CircuitsToolboxHelper
  {
    /// <summary>
    /// Toolbox initialization, called for each element tool on the toolbox.
    /// This version deals with each Component subtype separately.
    /// </summary>
    /// <param name="store"></param>
    /// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
    /// <returns>prototype of the object or group of objects to be created by tool</returns>
    protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
    {
        if (domainClassId == Transistor.DomainClassId)
        {
            Transistor transistor = new Transistor(store);

            transistor.Base = new ComponentTerminal(store);
            transistor.Collector = new ComponentTerminal(store);
            transistor.Emitter = new ComponentTerminal(store);

            transistor.Base.Name = "base";
            transistor.Collector.Name = "collector";
            transistor.Emitter.Name = "emitter";

            // Create an ElementGroup for the Toolbox.
            ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
            elementGroup.AddGraph(transistor, true);
            // AddGraph includes the embedded parts

            return elementGroup.CreatePrototype();
        }
        else
        {
            return base.CreateElementToolPrototype(store, domainClassId);
}  }    }

自訂連線工具

通常,當您建立新的連接器類別建立一個項目的工具。或者,您可以讓這兩個部分,來決定的關聯性類型的型別來多載的一種工具。例如,您可定義一個的 [連接] 工具,可以建立個人個人的關聯性和人鎮的關聯性。

連線工具叫用連接產生器。若要指定使用者可以如何連結在產生的設計工具中的項目,請使用連接產生器。連接產生器會指定可以連結的項目,而且會建立兩者之間的連結的類型。

當您建立網域類別之間的參考關聯性時,會自動建立連接產生器。當您對應的 [連接] 工具,您可以使用這個連接產生器。如需有關如何建立連線工具的詳細資訊,請參閱自訂工具和工具箱

使其可以處理不同的來源和目標型別,範圍建立不同類型的關聯性,您可以修改預設的連接產生器。

您也可以撰寫自訂程式碼連接產生器,來指定連線的來源和目標類別、 定義類型的連線,並開始建立連接的其他動作。

Bb126279.collapse_all(zh-tw,VS.110).gif結構的連接產生器

連接產生器包含一個或多個連結連接的指示詞,指定網域關聯性,以及來源與目標項目。比方說,在 [工作流程] 方案範本,您可以看到在 CommentReferencesSubjectsBuilder DSL 總管。這個連接產生器包含一個連結連線指示詞命名為 CommentReferencesSubjects,這會對應至網域關聯性 CommentReferencesSubjects。此連結連線指示詞包含來源角色指示詞所指Comment網域類別和目標角色指示詞所指FlowElement網域類別。

Bb126279.collapse_all(zh-tw,VS.110).gif若要限制來源和目標角色使用連接產生器

您可以使用連接產生器,來限制來源角色或指定的網域關聯性的 「 目標 」 角色中的特定類別的項目。比方說,您可能有其他的網域類別網域關聯性的基底網域類別,但您可能不想要擁有相同的角色,該關聯性中的基底類別的所有衍生的類別。在工作流程解決方案中,有四個具體的網域類別 (StartPoint、 端點、 MergeBranch 及同步處理) 直接從抽象的網域類別 FlowElement,繼承的類別和兩個具體的網域類別 (工作和 ObjectInState),間接繼承自它。此外,也會使用 FlowElement 網域類別在其來源角色 」 及 「 目標角色的流程參考關聯性。但是,端點網域類別的執行個體不應該流程關聯的執行個體的來源,也應該 StartPoint 類別的執行個體是流程關聯的執行個體的目標。FlowBuilder 連接產生器的連線名稱為指定類別可以玩哪些網域來源角色 (工作、 MergeBranch、 StartPoint 及同步處理),以及哪些可以播放 (MergeBranch、 結束點,以及同步處理) 的目標角色的流向指示詞連結。

Bb126279.collapse_all(zh-tw,VS.110).gif連接產生器,與多重連結連線的指示詞

您可以新增多個連結連接至連線的建立幫手] 的指示詞。這可以幫助您隱藏某些使用者的網域模型的複雜工作,並讓工具箱從取得太包含。您可以新增連結至單一連接產生器連接數個不同的網域關聯性的指示詞。不過,您應該在執行大約相同的函式時,合併網域關聯性。

在工作流程解決方案中,非固定格式的 [連接] 工具用來繪製流程與物件流程網域關聯性的執行個體。連接產生器,除了流程連結連接稍早所述的指示詞的 FlowBuilder,兩個連結連接的指示詞命名物件流程。這些指示詞會指定一個物件流程關聯的執行個體可能會要繪製的 ObjectInState 的網域類別,或執行個體的執行個體的一項工作,但不是介於兩個執行個體的工作,ObjectInState 或 ObjectInState 的執行個體的一項工作的執行個體的執行個體之間。不過,流程關聯的執行個體可能會繪製兩個工作執行個體之間。如果您編譯並執行工作流程方案時,您可以看到繪圖從 ObjectInState 的執行個體的流程,以任務的執行個體建立物件流程,具有執行個體,但繪圖的一項工作的兩個執行個體之間的流量的建立流程的執行個體。

Bb126279.collapse_all(zh-tw,VS.110).gif連接產生器的自訂程式碼

有四個中核取方塊使用者介面會定義不同類型的自訂連接產生器:

  • 自訂接受的來源或目標角色 」 指示詞] 核取方塊

  • 自訂連線的來源或目標角色 」 指示詞] 核取方塊

  • 會使用自訂連線連線指示詞] 核取方塊

  • 是自訂連線建立幫手的屬性

您必須提供程式的程式碼,以使這些自訂項目。要找出您必須提供哪些程式碼,檢查這些方塊的其中一個轉換所有範本,然後再次建置解決方案。將會產生一份錯誤報告。連按兩下 [錯誤報告給請參閱說明何種程式碼的註解,您應該加入。

注意事項注意事項

若要加入自訂程式碼,建立部分類別定義程式碼檔案中分開的 GeneratedCode 資料夾中的程式碼檔案。若要避免遺失您的工作,否則請勿編輯產生的程式碼檔案。如需詳細資訊,請參閱 覆寫及擴充產生的類別

Bb126279.collapse_all(zh-tw,VS.110).gif建立自訂連線的程式碼

在每個連結會連線指示詞, 來源角色指示詞 ] 索引標籤上定義的項目類型您可以拖曳。同樣地, 目標角色指示詞 ] 索引標籤上所定義項目類型您可以拖曳。每個型別,您可以進一步指定是否要允許連線 (如需該連結會連線指示詞) 藉由設定自訂接受加上旗標,然後提供額外的程式碼。

您也可以自訂連線時執行的動作。比方說,您可以自訂與特定的類別中,拖曳會發生的這樣的情況下,一個連結連接管理的指示詞,或整個 FlowBuilder 連線建立幫手]。針對每一個這些選項,您可以在適當的層級設定旗標。當您轉換所有的範本,並嘗試建置方案時,錯誤訊息會指引您在產生的程式碼中的註解。這些註解中,找出您必須提供。

在 [元件圖表範例中,連接產生器的連線網域關聯性就自訂為限制可以連接埠之間建立連線。下圖顯示您可以進行連線,只能從OutPort項目以InPort項目,但您可以使用巢狀在彼此的元件。

寄至 OutPort 巢狀元件中的連線

連接產生器

因此,您可以指定連線可能來自巢狀元件中的 OutPort。若要指定這類的連線,您將設定使用自訂接受InPort 型別與來源角色,並 OutPort 型別中的目標角色 DSL 的詳細資訊視窗,如下列圖例所示:

連結連線的 DSL 總管] 中的指示詞

連接產生器影像

連結連線的 DSL [細節] 視窗中的指示詞

Bb126279.ConnectionBuilder_4b(zh-tw,VS.110).png

然後,您必須提供 ConnectionBuilder 類別的方法:

  public partial class ConnectionBuilder
  {
    /// <summary>
    /// OK if this component has children
    /// </summary>
    private static bool CanAcceptInPortAsSource(InPort candidate)
    {
       return candidate.Component.Children.Count > 0;
    }

    /// <summary>
    /// Only if source is on parent of target.
    /// </summary>
    private static bool CanAcceptInPortAndInPortAsSourceAndTarget                (InPort sourceInPort, InPort targetInPort)
    {
      return sourceInPort.Component == targetInPort.Component.Parent;
    }
// And similar for OutPorts…

如需有關如何使用程式碼來自訂此模型的詳細資訊,請參閱巡覽及更新程式碼中的模型

可用類似的程式碼,例如,若要防止使用者建立父子式連結的迴圈。這些限制稱為硬' 條件約束,由於使用者無法在任何時候實施它們。您也可以建立使用者可以藉由建立無效的組態,它們不能儲存暫時略過軟體重的驗證檢查。

Bb126279.collapse_all(zh-tw,VS.110).gif很好的作法,定義連接產生器

您應該定義在概念上與相關時,才建立不同類型的關聯性的一個連接產生器。在工作流程範例中,您可以使用相同的建立幫手] 來建立任務之間以及任務與物件之間的流量。不過,它會混亂得難以使用相同的建立幫手] 來建立註解與任務之間的關係。

如果您定義的關聯性的多重類型的連線建立幫手] 時,您應該確定它不能對應多個從同一對來源和目標物件型別。否則,結果就是無法預期的。

套用 '硬' 的條件約束的情況下,您在使用自訂的程式碼,但您應該考慮使用者是否應該可以暫時將無效的連接。如果也應該如此,您可以修改條件約束,以便等到使用者嘗試儲存變更,不會驗證連線。

請參閱

概念

自訂項目的建立和移動

自訂複製行為

HOW TO:加入拖放處理常式

巡覽及更新程式碼中的模型

其他資源

電路圖表範例 DSL