Přizpůsobení okno Vlastnosti
V sadě Visual Studio můžete přizpůsobit vzhled a chování okna vlastností v jazyce specifickém pro vaši doménu (DSL). V definici DSL definujete vlastnosti domény pro každou třídu domény. Když ve výchozím nastavení vyberete instanci třídy, buď v diagramu, nebo v Průzkumníku modelů, bude každá vlastnost domény uvedená v okně vlastností. Díky tomu můžete zobrazit a upravit hodnoty vlastností domény, i když jste je nenamapovali na pole obrazců v diagramu.
Názvy, popisy a kategorie
Název a zobrazovaný název V definici vlastnosti domény je zobrazovaný název vlastnosti název, který se zobrazí za běhu v okně vlastností. Naproti tomu název se používá při psaní kódu programu pro aktualizaci vlastnosti. Název musí být správný alfanumerický název CLR, ale zobrazovaný název může obsahovat mezery.
Když nastavíte Název vlastnosti v definici DSL, jeho zobrazovaný název se automaticky nastaví na kopii Názvu. Pokud napíšete název Pascal cased, například "FuelGauge", zobrazí se zobrazovaný název automaticky mezera: "Palivo měřidlo". Zobrazovaný název ale můžete explicitně nastavit na jinou hodnotu.
Popis. Popis vlastnosti domény se zobrazí na dvou místech:
V dolní části okna vlastností, když uživatel vybere vlastnost. Můžete ho použít k vysvětlení uživateli, co tato vlastnost představuje.
Vygenerovaný kód programu. Pokud k extrakci dokumentace použijete dokumentace k rozhraní API, zobrazí se jako popis této vlastnosti v rozhraní API.
Kategorie: Kategorie je nadpis v okno Vlastnosti.
Zveřejnění funkcí stylu
Některé dynamické funkce grafických prvků mohou být reprezentovány nebo zpřístupněny jako vlastnosti domény. Funkci, která byla tímto způsobem zpřístupněna, může uživatel aktualizovat a může být snadněji aktualizována programovým kódem.
Klikněte pravým tlačítkem myši na třídu obrazce v definici DSL, přejděte na příkaz Přidat zveřejnění a zvolte funkci.
U obrazců můžete zveřejnit FillColor, OutlineColor, TextColor, OutlineDashStyle, OutlineThickness a FillGradientMode vlastnosti. U spojnic můžete zveřejnit vlastnosti Color,
TextColor, DashStyle a Thickness. V diagramech můžete vystavit FillColor a TextColor vlastnosti.
Předávání: Zobrazení vlastností souvisejících prvků
Když uživatel dsl vybere prvek v modelu, vlastnosti tohoto prvku se zobrazí v okně vlastností. Můžete ale také zobrazit vlastnosti zadaných souvisejících prvků. To je užitečné, pokud jste definovali skupinu prvků, které spolupracují. Můžete například definovat hlavní prvek a volitelný modul plug-in. Pokud je hlavní prvek mapován na obrazec a druhý není, je užitečné zobrazit všechny jejich vlastnosti, jako by byly na jednom prvku.
Tento efekt má název vlastnost forwarding, a to automaticky v několika případech. V jiných případech můžete dosáhnout předávání vlastností definováním popisovače typu domény.
Výchozí případy předávání vlastností
Když uživatel vybere obrazec nebo spojnici nebo prvek v Průzkumníku, zobrazí se v okno Vlastnosti následující vlastnosti:
Vlastnosti domény, které jsou definovány v doménové třídě prvku modelu, včetně těch, které jsou definovány v základních třídách. Výjimkou jsou vlastnosti domény, pro které jste nastavili možnost Browsable na
False
.Názvy prvků propojených relacemi s násobností 0,.1. To poskytuje pohodlnou metodu zobrazení volitelně propojených prvků, i když jste pro relaci nedefinovali mapování spojnic.
Domain properties of the embedding relationship that target the element. Vzhledem k tomu, že se relace vkládání obvykle nezobrazují explicitně, umožní to uživateli zobrazit jejich vlastnosti.
Vlastnosti domény definované u vybraného obrazce nebo spojnice
Přidání předávání vlastností
Pokud chcete předat vlastnost, definujte popisovač typu domény. Pokud máte vztah domény mezi dvěma třídami domény, můžete použít popisovač typu domény k nastavení vlastnosti domény v první třídě na hodnotu vlastnosti domény ve druhé třídě domény. Pokud máte například vztah mezi třídou domény Knihy a třídou domény Autor, můžete pomocí popisovače typu domény nastavit vlastnost Název autora knihy v okno Vlastnosti, když uživatel vybere Knihu.
Poznámka:
Předávání vlastností má vliv pouze na okno Vlastnosti, když uživatel upravuje model. Nedefinuje vlastnost domény pro přijímající třídu. Chcete-li získat přístup k předané doméně vlastnost v jiných částech definice DSL nebo v kódu programu, musíte přistupovat k předávací prvek.
Následující postup předpokládá, že jste vytvořili DSL. Několik prvních kroků shrnuje požadavky.
Předání vlastnosti z jiného prvku
Vytvořte řešení Jazykové nástroje specifické pro doménu, které obsahuje aspoň dvě třídy, které se v tomto příkladu nazývají Knihy a Autor. Mezi knihou a autorem by měl být vztah.
Násobnost zdrojové role (role na straně knihy ) by měla být 0..1 nebo 1..1, aby každá kniha měla jednoho autora.
V DSL Exploreru klepněte pravým tlačítkem myši na třídu domény knihy a potom klepněte na tlačítko Přidat Nový DomainTypeDescriptor.
Uzel s názvem Cesty popisovačů vlastních vlastností se zobrazí pod uzlem popisovače vlastního typu.
Klikněte pravým tlačítkem myši na uzel Popisovač vlastního typu a potom klepněte na tlačítko Přidat novou vlastnostPath.
V uzlu Popisovače vlastních vlastností se zobrazí nová cesta k vlastnosti.
Vyberte novou cestu vlastnosti a v okně Vlastnosti nastavte cestu na Vlastnost na cestu příslušného prvku modelu.
Cestu můžete upravit ve stromovém zobrazení kliknutím na šipku dolů napravo od této vlastnosti. Další informace o cestách k doméně naleznete v tématu Syntaxe cesty k doméně. Po úpravách by cesta měla vypadat podobně jako BookReferencesAuthor.Author/! Autor.
Nastavte vlastnost Name domain vlastnost Author.
Nastavte zobrazované jméno na jméno autora.
Transformujte všechny šablony, sestavte a spusťte DSL.
V diagramu modelu vytvořte knihu, autora a propojte je pomocí referenční relace. Vyberte prvek knihy a v okno Vlastnosti kromě vlastností knihy byste měli vidět jméno autora. Změňte jméno propojeného autora nebo propojte knihu s jiným autorem a všimněte si, že se změní jméno autora knihy.
Vlastní editory vlastností
Okno vlastnosti poskytuje vhodné výchozí prostředí pro úpravy pro typ každé vlastnosti domény. Například pro výčtový typ uživatel uvidí rozevírací seznam a pro číselnou vlastnost může uživatel zadat číslice. To platí jenom pro předdefinované typy. Pokud zadáte externí typ, uživatel uvidí hodnoty vlastnosti, ale nebude ho upravovat.
Můžete ale zadat následující editory a typy:
Jiný editor, který se používá se standardním typem. Můžete například zadat editor cest k souboru pro vlastnost řetězce.
Externí typ vlastnosti domény a editor pro ni.
Editor .NET, například editor cesty k souboru, nebo můžete vytvořit vlastní editor vlastností.
Převod mezi externím typem a typem, jako je String, který má výchozí editor.
V DSL externí typ je jakýkoli typ, který není jedním z jednoduchých typů (například Boolean nebo Int32) nebo String.
Definování vlastnosti domény s externím typem
V Průzkumník řešení přidejte odkaz na sestavení (DLL), který obsahuje externí typ projektu Dsl.
Sestavení může být sestavení .NET nebo sestavení dodané vámi.
Pokud jste to ještě neudělali, přidejte typ do seznamu Typy domén.
Otevřete DslDefinition.dsl a v Průzkumníku DSL klepněte pravým tlačítkem myši na kořenový uzel a potom klepněte na tlačítko Přidat nový externí typ.
V uzlu Typy domén se zobrazí nová položka.
Upozorňující
Položka nabídky je v kořenovém uzlu DSL, nikoli v uzlu Typy domén.
Nastavte název a obor názvů nového typu v okno Vlastnosti.
Přidejte vlastnost domény do třídy domény obvyklým způsobem.
V okno Vlastnosti vyberte externí typ z rozevíracího seznamu v poli Typ.
V této fázi můžou uživatelé zobrazit hodnoty vlastnosti, ale nemůžou je upravovat. Zobrazené hodnoty jsou získány z
ToString()
funkce. Můžete napsat kód programu, který nastaví hodnotu vlastnosti, například v příkazu nebo pravidle.
Nastavení editoru vlastností
Do vlastnosti domény přidejte atribut CLR v následujícím formátu:
[System.ComponentModel.Editor (
typeof(AnEditor),
typeof(System.Drawing.Design.UITypeEditor))]
Atribut u vlastnosti můžete nastavit pomocí položky Vlastní atribut v okno Vlastnosti.
Typ AnEditor
musí být odvozen od typu zadaného v druhém parametru. Druhý parametr by měl být buď UITypeEditor nebo ComponentEditor. Další informace najdete na webu EditorAttribute.
Můžete zadat vlastní editor nebo editor .NET, například FileNameEditor nebo ImageEditor. Například pomocí následujícího postupu můžete mít vlastnost, ve které může uživatel zadat název souboru.
Definování vlastnosti domény názvu souboru
Přidejte vlastnost domény do třídy domény v definici DSL.
Vyberte novou vlastnost. Do pole Vlastní atribut v okno Vlastnosti zadejte následující atribut. Chcete-li zadat tento atribut, klikněte na tři tečky [...] a pak zadejte název atributu a parametry samostatně:
[System.ComponentModel.Editor ( typeof(System.Windows.Forms.Design.FileNameEditor) , typeof(System.Drawing.Design.UITypeEditor))]
Ponechte typ vlastnosti domény ve výchozím nastavení String.
Pokud chcete editor otestovat, ověřte, že uživatelé mohou otevřít editor názvů souborů a upravit vlastnost domény.
Stiskněte kombinaci kláves CTRL+F5 nebo F5. V řešení ladění otevřete testovací soubor. Vytvořte prvek třídy domény a vyberte ho.
V okno Vlastnosti vyberte vlastnost domény. Pole s hodnotou zobrazuje tři tečky [...].
Klikněte na tři tečky. Zobrazí se dialogové okno soubor. Vyberte soubor a zavřete dialogové okno. Cesta k souboru je nyní hodnotou vlastnosti domény.
Definování vlastního editoru vlastností
Můžete definovat vlastní editor. Uděláte to tak, že uživateli umožníte upravit typ, který jste definovali, nebo upravit standardní typ zvláštním způsobem. Můžete například umožnit uživateli zadat řetězec, který představuje vzorec.
Definujete editor napsáním třídy, která je odvozena z UITypeEditor. Vaše třída musí přepsat:
EditValue, pro interakci s uživatelem a aktualizaci hodnoty vlastnosti.
GetEditStyle, chcete-li určit, zda editor otevře dialogové okno nebo poskytne rozevírací nabídku.
Můžete také poskytnout grafické znázornění hodnoty vlastnosti, která se zobrazí v mřížce vlastností. Chcete-li to provést, přepsat GetPaintValueSupported
a PaintValue
. Další informace najdete na webu UITypeEditor.
Poznámka:
Přidejte kód do samostatného souboru kódu v projektu Dsl .
Příklad:
internal class TextFileNameEditor : System.Windows.Forms.Design.FileNameEditor
{
protected override void InitializeDialog(System.Windows.Forms.OpenFileDialog openFileDialog)
{
base.InitializeDialog(openFileDialog);
openFileDialog.Filter = "Text files(*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog.Title = "Select a text file";
}
}
Chcete-li použít tento editor, nastavte vlastní atribut vlastnosti domény na:
[System.ComponentModel.Editor (
typeof(MyNamespace.TextFileNameEditor)
, typeof(System.Drawing.Design.UITypeEditor))]
Další informace najdete na webu UITypeEditor.
Zadání rozevíracího seznamu hodnot
Můžete zadat seznam hodnot, ze které si uživatel může vybrat.
Poznámka:
Tato technika poskytuje seznam hodnot, které se můžou změnit za běhu. Pokud chcete zadat seznam, který se nezmění, zvažte místo toho použití výčtového typu jako typu vlastnosti vaší domény.
Chcete-li definovat seznam standardních hodnot, přidejte do vlastnosti domény atribut CLR, který má následující formulář:
[System.ComponentModel.TypeConverter
(typeof(MyTypeConverter))]
Definujte třídu, která je odvozena od TypeConverter. Přidejte kód do samostatného souboru v projektu Dsl . Příklad:
/// <summary>
/// Type converter that provides a list of values
/// to be displayed in the property grid.
/// </summary>
/// <remarks>This type converter returns a list
/// of the names of all "ExampleElements" in the
/// current store.</remarks>
public class MyTypeConverter : System.ComponentModel.TypeConverter
{
/// <summary>
/// Return true to indicate that we return a list of values to choose from
/// </summary>
/// <param name="context"></param>
public override bool GetStandardValuesSupported
(System.ComponentModel.ITypeDescriptorContext context)
{
return true;
}
/// <summary>
/// Returns true to indicate that the user has
/// to select a value from the list
/// </summary>
/// <param name="context"></param>
/// <returns>If we returned false, the user would
/// be able to either select a value from
/// the list or type in a value that is not in the list.</returns>
public override bool GetStandardValuesExclusive
(System.ComponentModel.ITypeDescriptorContext context)
{
return true;
}
/// <summary>
/// Return a list of the values to display in the grid
/// </summary>
/// <param name="context"></param>
/// <returns>A list of values the user can choose from</returns>
public override StandardValuesCollection GetStandardValues
(System.ComponentModel.ITypeDescriptorContext context)
{
// Try to get a store from the current context
// "context.Instance" returns the element(s) that
// are currently selected i.e. whose values are being
// shown in the property grid.
// Note that the user could have selected multiple objects,
// in which case context.Instance will be an array.
Store store = GetStore(context.Instance);
List<string> values = new List<string>();
if (store != null)
{
values.AddRange(store.ElementDirectory
.FindElements<ExampleElement>()
.Select<ExampleElement, string>(e =>
{
return e.Name;
}));
}
return new StandardValuesCollection(values);
}
/// <summary>
/// Attempts to get to a store from the currently selected object(s)
/// in the property grid.
/// </summary>
private Store GetStore(object gridSelection)
{
// We assume that "instance" will either be a single model element, or
// an array of model elements (if multiple items are selected).
ModelElement currentElement = null;
object[] objects = gridSelection as object[];
if (objects != null && objects.Length > 0)
{
currentElement = objects[0] as ModelElement;
}
else
{
currentElement = gridSelection as ModelElement;
}
return (currentElement == null) ? null : currentElement.Store;
}
}