Dostosowywanie okna właściwości
W języku specyficzne dla domeny (DSL) można dostosować wygląd i zachowanie okna właściwości w Visual Studio.W Państwa definicji DSL właściwości domeny definiuje się na każdej klasy domeny.Domyślnie po wybraniu instancji klasy, w diagramie lub w Eksploratorze modelu dla każdej właściwości domeny jest wymienione w oknie dialogowym właściwości.Dzięki temu można oglądać i edytować wartości właściwości domeny, nawet jeśli nie ma ich mapowane do pól kształtu na diagramie.
Nazwy, opisy i kategorie
Nazwa i nazwa wyświetlana.W Państwa definicji właściwości domeny nazwę wyświetlaną właściwość jest nazwę, która pojawia się w czasie wykonywania, w oknie dialogowym właściwości.Z drugiej strony Nazwa jest używana podczas pisania kodu programu, aby zaktualizować właściwość.Nazwa musi być prawidłową nazwę alfanumeryczne CLR, ale nazwa wyświetlana może zawierać spacji.
Gdy nazwa właściwości jest ustawiona w definicji DSL, jej nazwa wyświetlana jest automatycznie ustawiana do kopiowania nazwy.Jeśli piszesz nazwa latach Pascal, takich jak "FuelGauge", nazwa wyświetlana będzie automatycznie zawierać spacji: "Szerokość toru paliwa".Można jednak jawnie ustaw nazwę wyświetlaną, na inną wartość.
Opis.Opis właściwości domeny pojawi się w dwóch miejscach:
W dolnej części okna właściwości, gdy użytkownik wybierze opcję Właściwości.Można użyć go do wyjaśnienia użytkownika reprezentuje właściwość.
W kodzie programu wygenerowany.Jeśli używasz urządzenia dokumentacji wyodrębnić dokumentacji interfejsu API, pojawi się jako opis tej właściwości w interfejsie API.
Kategoria.Kategoria jest pozycją w oknie dialogowym właściwości.
Uwidacznianie funkcje stylu
Niektóre funkcje dynamiczne elementy graficzne można przedstawić lub narażone jako właściwości domeny.Funkcja, która wystawiła w ten sposób mogą być aktualizowane przez użytkownika i można łatwo zostać zaktualizowany przez kod programu.
Kliknij prawym przyciskiem myszy klasę kształtu w definicji DSL, wskaż polecenie Dodać narażonych, a następnie wybierz funkcję.
W kształtach może narazić FillColor, OutlineColor, TextColor, OutlineDashStyle, OutlineThickness i FillGradientMode właściwości.W łącznikach może narazić Kolor,TextColor, DashStyle, i Grubość właściwości.Na diagramach może narazić FillColor i TextColor właściwości.
Przesyłanie dalej: Wyświetlanie właściwości powiązanych elementów
Gdy użytkownik łączy DSL zaznacza element w modelu, właściwości tego elementu są wyświetlane w oknie dialogowym właściwości.Jednak można również wyświetlić właściwości określone elementy pokrewne.Jest to przydatne, jeśli zostały zdefiniowane grupy elementów, który współpracuje ze sobą.Na przykład zdefiniować element główny i opcjonalnego elementu dla dodatku plug-in.Jeśli drugi nie jest głównym elementem jest mapowany do kształtu, jest przydatne zobaczyć ich właściwości, tak jakby znajdowały się one w jeden element.
Efekt ten nosi nazwę przesyłania dalej właściwość, automatycznie dzieje się w kilku przypadkach.W pozostałych przypadkach można osiągnąć właściwości przekazywania przez definiowanie deskryptora typu domeny.
Domyślne właściwości przekazywania przypadkach
Gdy użytkownik wybierze kształtu lub łącznika lub elementu w Eksploratorze, następujące właściwości są wyświetlane w oknie dialogowym właściwości:
Właściwości domeny, które są zdefiniowane w klasie domeny elementu modelu, łącznie z tymi, które są zdefiniowane w klasie bazowej.Wyjątek stanowi właściwości domeny, dla których ustawiono Jest przeglądana do False.
Nazwy elementów, które są połączone relacjami, które mają mnożenia od 0 do 1.Zapewnia wygodną metodę zagraża opcjonalnie połączone elementy, nawet jeśli nie zdefiniowano mapowania łącznik dla relacji.
Właściwości domeny osadzania relacji, który jest przeznaczony dla elementu.Ponieważ osadzania relacji zazwyczaj nie są wyświetlane jawnie, dzięki temu użytkownik widzi ich właściwości.
Właściwości domeny, które są zdefiniowane dla zaznaczonego kształtu lub łącznika.
Dodawanie właściwości przekazywania
Do przodu właściwość, należy zdefiniować deskryptora typu domeny.Jeśli domeny relację między dwoma klasami domeny umożliwia właociwooć pierwszej klasy do wartości właściwości domeny w drugiej klasie domeny domena deskryptora typu domeny.Na przykład jeśli relację między klasy domeny książki i klasę domeny autora, można użyć deskryptora typu domeny Aby właściwość Name Autor księgi są wyświetlane w oknie dialogowym właściwości, gdy użytkownik wybierze książki.
[!UWAGA]
Przekazywanie właściwości ma wpływ na tylko okno właściwości, gdy użytkownik edytuje modelu.Definiuje właściwości domeny na odbierającym klasy.Jeśli dostęp do właściwości przesyłanych dalej domeny w innych częściach definicji DSL lub w kodzie programu musi dostęp do elementu przesyłania dalej.
W poniższej procedurze przyjęto, że utworzono DSL.Pierwsze kroki kilka Podsumowanie warunków wstępnych.
Do właściwości w przód od innego elementu
Tworzenie Narzędzia językowe właściwe dla domeny roztworu, który zawiera co najmniej dwóch klas, które w tym przykładzie są nazywane książki i autor.Powinny istnieć relacja albo rodzaju między książki i autor.
Liczebność źródła roli (rola po stronie książki) powinny być od 0 do 1 lub 1..1, tak, aby każda książka ma jednego autora.
W DSL Explorer, kliknij prawym przyciskiem myszy klasę domeny książki, a następnie kliknij przycisk Dodaj nowy DomainTypeDescriptor.
Węzeł o nazwie Ścieżki niestandardowe właściwości deskryptorów jest wyświetlany w obszarze Niestandardowy typ deskryptora węzła.
Kliknij prawym przyciskiem myszy Niestandardowy typ deskryptora węzeł, a następnie kliknij przycisk Dodaj nowy PropertyPath.
Nowa ścieżka właściwości pojawia się pod Ścieżki niestandardowe właściwości deskryptorów węzła.
Wybierz nową ścieżkę właściwości i w Właściwości okno, ustawić ścieżki do właściwości do ścieżki elementu odpowiedni model.
Ścieżka w widoku drzewa można edytować, klikając strzałkę w dół po prawej stronie tej właściwości.Aby uzyskać więcej informacji o ścieżkach domeny, zobacz Składnia ścieżki domeny.Jeśli edytowano ją powinien przypominać ścieżkę BookReferencesAuthor.Author/!Autor.
Ustaw Właściwość do Name domen właściwość Autor.
Ustaw Nazwa wyświetlana do imię i nazwisko autora.
Przekształć wszystkie szablony, tworzenie i uruchamianie DSL.
Na diagramie modelu książki, autora, utworzyć i połączyć je przy użyciu relacji odniesienia.Wybierz element, książki i w oknie dialogowym właściwości należy Zobacz imię i nazwisko autora, oprócz właściwości książki.Zmień nazwę autora połączone lub łącze książki do innego autora i obserwować, że zmienia nazwę autora książki.
Edytory właściwości niestandardowych
Okno właściwości zawiera odpowiedni domyślny, Edycja doświadczenie dla typu właściwości każdej domeny.Na przykład dla typem wyliczeniowym, użytkownik widzi listy rozwijanej, a dla właściwości liczbowych, użytkownik może wprowadzić cyfr.Dotyczy to tylko dla wbudowanych typów.Jeśli typ zewnętrznych użytkownik będzie mógł zobaczyć wartości właściwości, ale nie można go edytować.
Można jednak określić następujące edytory i typy:
Inny edytor jest używany z typu standardowe.Na przykład można określić Edytor ścieżkę pliku dla właściwości ciąg.
Zewnętrzny typ właściwości domeny i edytor.
A.Edytor netto, takich jak edytor ścieżkę pliku lub można utworzyć Edytor właściwości niestandardowej.
Konwersja między typem zewnętrznych i typu, takie jak ciąg, który ma domyślny edytor.
W DSL typu zewnętrznego jest dowolnego typu, który nie jest jednym z prostych typów (takich jak logiczną lub Int32) lub ciąg.
Aby zdefiniować właściwość domeny, która ma typ zewnętrznych
W Solution Explorer, dodać odwołanie do zestawu (DLL) zawiera typu zewnętrznego w Dsl projektu.
Zgromadzenie może być.Montaż netto, lub zespół dostarczone przez użytkownika.
Dodać typ do Domeny typów listy, o ile nie zostały jeszcze zrobione.
Otwórz DslDefinition.dsl i w DSL Explorer, kliknij prawym przyciskiem myszy węzeł główny, a następnie kliknij przycisk Dodać nowy typ zewnętrznych.
Nowy wpis jest wyświetlany w obszarze Domeny typów węzła.
Przestroga Element menu nie jest w węźle głównym DSL, Domeny typów węzła.
Ustawianie nazwy i obszaru nazw nowy typ w oknie dialogowym właściwości.
Dodawanie właściwości domeny do klasy domeny w zwykły sposób.
W oknie dialogowym właściwości wybierz zewnętrzny typ z listy rozwijanej w typu pola.
Na tym etapie użytkownicy mogą wyświetlać wartości właściwości, ale one nie można go edytować.Wartości wyświetlane są uzyskiwane z ToString() funkcji.Można napisać kod programu, który ustawia wartość właściwości, na przykład polecenia lub reguły.
Ustawienie Edytor właściwości
Dodaj atrybut CLR właściwości domeny, w następującej formie:
[System.ComponentModel.Editor (
typeof(AnEditor),
typeof(System.Drawing.Design.UITypeEditor))]
Atrybut można ustawić dla właściwości przy użyciu Niestandardowy atrybut wpis w oknie dialogowym właściwości.
Typ AnEditor musi pochodzić od typu określonego w drugim parametrze.Drugi parametr, należy albo UITypeEditor lub ComponentEditor.Aby uzyskać więcej informacji, zobacz EditorAttribute.
Można określić własne edytora lub Edytor dostarczonych w .NET Framework, takich jak FileNameEditor lub ImageEditor.Na przykład można użyć poniższej procedury mają właściwości, w którym użytkownik może wprowadzić nazwę pliku.
Aby zdefiniować właściwości domeny nazwa pliku
Dodaj właściwość domeny do klasy domeny w Państwa definicji DSL.
Wybierz nowe właściwości.W Niestandardowy atrybut pól w oknie dialogowym właściwości, należy wprowadzić następujący atrybut.Aby wprowadzić ten atrybut, kliknij przycisk wielokropka [...] a następnie wprowadź nazwę atrybutu i parametry oddzielnie:
[System.ComponentModel.Editor ( typeof(System.Windows.Forms.Design.FileNameEditor) , typeof(System.Drawing.Design.UITypeEditor))]
Pozostaw typ właściwości domeny jego domyślne ustawienie String.
Aby przetestować edytor, sprawdź, czy użytkownicy otworzyć Edytor nazwy plików, aby edytować właściwości użytkownika domeny.
Naciśnij kombinację klawiszy CTRL + F5 lub F5.W roztworze debugowania należy otworzyć plik testowy.Utwórz element klasy domeny, a następnie zaznacz go.
W oknie dialogowym właściwości wybierz właściwości domeny.Pole wartości zawiera wielokropek [...].
Kliknij przycisk wielokropka.Zostanie wyświetlone okno dialogowe pliku.Wybierz plik i zamknij okno dialogowe.Ścieżka pliku jest teraz wartość właściwości domeny.
Definiowanie Edytor właściwości
Można zdefiniować własne edytora.Czy zrobić to pozwala użytkownikowi edytować tekst, który został zdefiniowany lub edytować standardowy typ w specjalny sposób.Na przykład można zezwolić użytkownikowi na dane wejściowe ciąg, który reprezentuje formułę.
Zdefiniować edytor pisząc klasa, która wywodzi się z UITypeEditor.Należy zastąpić klasy:
EditValue, do interakcji z użytkownikiem i aktualizacji wartość właściwości.
GetEditStyle, aby określić czy edytor będzie otworzyć okno dialogowe lub dostarczyć menu rozwijanego.
Możesz także podać graficzna reprezentacja wartości właściwości, które będą wyświetlane w siatce właściwości.Aby to zrobić, należy zastąpić GetPaintValueSupported, i PaintValue.Aby uzyskać więcej informacji, zobacz UITypeEditor.
[!UWAGA]
Dodaj kod w pliku osobnego kodu w Dsl projektu.
Na przykład:
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";
}
}
Aby użyć tego edytora, należy ustawić Niestandardowy atrybut właściwości domeny:
[System.ComponentModel.Editor (
typeof(MyNamespace.TextFileNameEditor)
, typeof(System.Drawing.Design.UITypeEditor))]
Aby uzyskać więcej informacji, zobacz UITypeEditor.
Dostarczanie listy rozwijanej wartości
Można podać listę wartości dla użytkownika, które można wybierać.
[!UWAGA]
Technika ta zawiera listę wartości, które można zmieniać w czasie wykonywania.Jeśli chcesz podać listę, która nie powoduje zmiany, należy rozważyć zamiast przy użyciu wyliczeniowych jako typ właściwości użytkownika domeny.
Aby zdefiniować listę standardowych wartości, należy dodać do domain, właściwość atrybutu CLR, który ma następującą postać:
[System.ComponentModel.TypeConverter
(typeof(MyTypeConverter))]
Zdefiniowanie klasy, która wynika z TypeConverter.Dodaj kod w oddzielnym pliku w Dsl projektu.Na przykład:
/// <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;
}
}