HOW TO:使用網域指定的語言修改標準功能表命令
您可以修改一些標準的命令,以在您的 DSL 自動定義的行為。例如,您可以修改剪下 ,讓它不包含機密資訊。若要這樣做,您會覆寫命令集合類別的方法。這些類別中的 CommandSet.cs 檔案,請在 [DslPackage] 專案中,定義和衍生自CommandSet。
在 [摘要] 修改命令:
找出哪些指令可以修改。
建立部分類別的宣告中適當的指令集。
覆寫方法,ProcessOnStatus 和 ProcessOnMenu 的指令。
本主題將說明此程序。
注意事項 |
---|
如果您想要建立您自己的功能表指令,請參閱HOW TO:在捷徑功能表中加入命令。 |
您可以修改哪些指令?
若要找出哪些指令您可以修改
在 DslPackage 專案中,開啟 GeneratedCode\CommandSet.cs。C# 找這個檔案可以在 [方案總管] 中為可將子公司的 CommandSet.tt。
在這個檔案以其名稱結尾找到類別"CommandSet」,例如Language1CommandSet和Language1ClipboardCommandSet。
在每個命令集類別中,輸入"override"後面接著一個空格。IntelliSense 會顯示一份您可以覆寫的方法。每個命令都是成對的名稱開頭的方法"ProcessOnStatus"和"ProcessOnMenu"。
附註此指令的設定類別包含您想要修改的指令。
請關閉檔案而不儲存您的編輯。
注意事項 一般來說,您應該不能編輯已經產生的檔案。任何的編輯動作將會遺失檔案所產生的下一次。
擴充適當的指令集類別
建立新的檔案,其中包含部分類別的宣告命令集。
若要擴充的命令將設定類別
在 [方案總管] 中,在 DslPackage 專案中,開啟 [GeneratedCode] 資料夾,再看 CommandSet.tt 下,開啟其產生的檔案 CommandSet.cs。附註的命名空間和類別名稱的第一個那里定義。例如,您可能會看到:
namespace Company.Language1
{ ... internal partial class Language1CommandSet : ...
在 DslPackage,建立名為自訂程式碼的資料夾。在這個資料夾中,建立新的類別檔案,名為 CommandSet.cs。
在新的檔案中,撰寫的部分宣告有相同的命名空間和產生的部分類別的名稱。例如:
using System; using System.Collections.Generic; using System.ComponentModel.Design; namespace Company.Language1 /* Make sure this is correct */ { internal partial class Language1CommandSet { ...
附註如果您使用 [類別檔] 範本來建立新的檔案時,您必須更正命名空間和類別名稱。
覆寫命令方法
大部分的命令有兩個相關聯的方法: 具有名稱的方法要 ProcessOnStatus...判斷是否命令應該看得見的且處於啟用狀態。每當使用者以滑鼠右鍵按一下圖表中,會呼叫應該迅速執行和不做任何變更。ProcessOnMenu...當使用者按一下指令,並應該執行命令的函式呼叫。您可以覆寫一或兩個方法。
若要變更時,功能表上出現的命令
覆寫 ProcessOnStatus...方法:這個方法應該設定看得見,並啟用其參數為 MenuCommand 的屬性。通常指令探討此問題。CurrentSelection,以判斷是否命令套用至選取的項目,也可以試試它們的屬性,以決定命令是否可以套用在目前的狀態。
做為概略的指示,為 [看得見] 屬性應該選取哪些項目所決定。[啟用] 屬性,用來決定指令是出現黑色或灰色] 功能表上的,應該依存於選取範圍的目前狀態。
當使用者選取了多個圖案,則下列範例會停用刪除功能表項目。
注意事項 |
---|
這個方法不會影響命令是否可以透過按鍵動作。例如,停用刪除功能表項目不會防止命令叫用的透過刪除機碼。 |
/// <summary>
/// Called when user right-clicks on the diagram or clicks the Edit menu.
/// </summary>
/// <param name="command">Set Visible and Enabled properties.</param>
protected override void ProcessOnStatusDeleteCommand (MenuCommand command)
{
// Default settings from the base method.
base.ProcessOnStatusDeleteCommand(command);
if (this.CurrentSelection.Count > 1)
{
// If user has selected more than one item, Delete is greyed out.
command.Enabled = false;
}
}
它是很好的做法,先呼叫基底方法,以應付所有情況下,設定要用您不再亦。
ProcessOnStatus 方法不應該建立、 刪除或更新存放區中的項目。
若要變更命令的行為
覆寫 ProcessOnMenu...方法:下面範例防止使用者從一次刪除多個項目,甚至是藉由使用 Delete 鍵。
/// <summary>
/// Called when user presses Delete key
/// or clicks the Delete command on a menu.
/// </summary>
protected override void ProcessOnMenuDeleteCommand()
{
// Allow users to delete only one thing at a time.
if (this.CurrentSelection.Count <= 1)
{
base.ProcessOnMenuDeleteCommand();
}
}
當您的程式碼會變更存放區,例如建立、 刪除或更新項目或連結,您必須進行在交易內。如需詳細資訊,請參閱 HOW TO:使用網域指定的語言修改標準功能表命令。
撰寫方法的程式碼
下列片段是通常很有用,這些方法中:
this.CurrentSelection.使用者以滑鼠右鍵按一下圖形總是會預留的圖案及連接線這份清單中。如果使用者按一下圖表的空白部分,圖表就會是清單的唯一的成員。
this.IsDiagramSelected() - true如果使用者按一下圖表的空白部分。
this.IsCurrentDiagramEmpty()
this.IsSingleSelection()-使用者沒有選取 [多個圖形
this.SingleSelection-使用者用滑鼠右鍵按一下圖表的圖形
shape.ModelElement as MyLanguageElement-圖形所代表的模型項目。
如需有關如何瀏覽項目元素,以及有關如何建立物件和連結的詳細資訊,請參閱巡覽及更新程式碼中的模型。