Share via


Erstellen einer LightSwitch-Bildschirmvorlage

LightSwitch enthält Vorlagen, mit denen Sie Bildschirme mit gängigen Mustern erstellen können. Sie können auch Vorlagen entwickeln, die Sie mit einer bestimmten Datenquelle oder einem beliebigen Datentyp verwenden können.

Eine Bildschirmvorlage erstellt Daten und Steuerelemente für einen Bildschirm auf der Grundlage von Informationen, die ein Entwickler im Dialogfeld Bildschirm hinzufügen angibt. Bildschirmvorlagen können auch programmiert werden, um Code für den Bildschirm hinzuzufügen.

Die Methoden zum Erstellen von HTML-Clientbildschirmvorlagen entsprechen den hier dargestellten Methoden für Desktopclient-Bildschirmvorlagen. Den Hauptunterschied machen ViewIDs aus, die für jeden Clienttyp unterschiedlich sind. Siehe LightSwitch-Steuerelement ViewIDs.

Hinweis

In diesem Dokument werden zahlreiche Szenarien veranschaulicht, die sich über Bildschirmvorlagen umsetzen lassen. Es wird jedoch nicht gezeigt, wie Sie eine tatsächliche Vorlage erstellen, die mehrfach verwendbar ist.Bei der Vorlagenerstellung können Sie diese Szenarien als empfohlene Vorgehensweise verwenden.Sie können ein Beispiel, das sowohl Desktopclient- als auch HTML-Clientvorlagen enthält, aus der MSDN Code Gallery herunterladen.

Definieren einer Bildschirmvorlage

Um eine Bildschirmvorlage zu erstellen, erstellen Sie zunächst ein Projekt mithilfe der Projektvorlage LightSwitch-Erweiterungsbibliothek, die vom LightSwitch Extensibility Toolkit für Visual Studio 2013 bereitgestellt wird. Wenn Sie das Projekt erstellen, wählen Sie entweder Visual Basic oder C# als Entwicklungssprache aus.

So definieren Sie eine Bildschirmvorlage

  1. Wählen Sie im Projektmappen-Explorer das LibraryName.Lspkg-Projekt aus, wobei LibraryName der Name des Erweiterungsprojekts ist.

  2. Wählen Sie in der Menüleiste Projekt, Neues Element hinzufügen aus.

  3. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option LightSwitch-Bildschirmvorlage aus.

  4. Geben Sie im Feld Name einen Namen für die Bildschirmvorlage ein. Das ist der Name, den Entwickler im Dialogfeld Bildschirm hinzufügen sehen.

  5. Klicken Sie auf die Schaltfläche OK.

    Eine Klasse, die die Bildschirmvorlage repräsentiert, wird dem Ordner Bildschirmvorlagen im Design-Projekt hinzugefügt. Die TemplateName.vb-Datei bzw. die TemplateName.cs-Datei enthält den gesamten Code für die Vorlage. Alle Beispiele in diesem Dokument befinden sich in dieser Datei.

    Auch zwei Bilddateien werden dem Projekt im Ressource\ScreenTemplateImages-Ordner hinzugefügt. Diese repräsentieren die Bilder, die für die Vorlage im Dialogfeld Bildschirm hinzufügen angezeigt werden.

Hh304432.collapse_all(de-de,VS.140).gifAngeben des Anzeigenamens und der Beschreibung

Die Eigenschaften DisplayName und Description stellen den Namen und die Beschreibung bereit, die für die Bildschirmvorlage im Dialogfeld Bildschirm hinzufügen angezeigt werden.

Im folgenden Beispiel werden die Eigenschaften Description und DisplayName angezeigt, die für eine Bildschirmvorlage mit dem Namen "Test Template" generiert werden. Sie sollten dafür einen Namen und eine Beschreibung wählen, die aussagekräftiger sind.

Public ReadOnly Property Description As String Implements IScreenTemplateMetadata.Description
            Get
                Return "Test Template Description"
            End Get
        End Property

        Public ReadOnly Property DisplayName As String Implements IScreenTemplateMetadata.DisplayName
            Get
                Return "Test Template"
            End Get
        End Property
public string Description
        {
            get { return "TestTemplate Description"; }
        }

        public string DisplayName
        {
            get { return "Test Template"; }
        }

Hh304432.collapse_all(de-de,VS.140).gifAngeben der Stammdatenquelle

Die RootDataSource-Eigenschaft bestimmt, welche Datentypen von der Bildschirmvorlage angezeigt werden können. Die Datentypen sind in der Option Bildschirmdaten im Dialogfeld Bildschirm hinzufügen verfügbar. Die RootDataSource-Eigenschaft besitzt vier gültige Werte:

Collection

Aktiviert die Auswahl von Auflistungen oder von mehreren Ergebnisabfragen.

ScalarEntity

Aktiviert die Auswahl von einem Entitätstyp oder von Abfragen, die ein Element zurückgeben.

NewEntity

Wird für Bildschirme verwendet, die dazu bestimmt sind, das Erstellen von neuen Entitäten zu ermöglichen.

None

Wird für Bildschirme verwendet, auf denen keine Daten ausgewählt werden sollen.

Im folgenden Beispiel wird Collection als RootDataSource angegeben.

Public ReadOnly Property RootDataSource As RootDataSourceType Implements IScreenTemplateMetadata.RootDataSource
            Get
                Return RootDataSourceType.Collection
            End Get
        End Property
public RootDataSourceType RootDataSource
        {
            get { return RootDataSourceType.Collection; }
        }

Hh304432.collapse_all(de-de,VS.140).gifFestlegen der Unterstützung für untergeordnete Auflistungen

In manchen Fällen muss eine Bildschirmvorlage auch Daten anzeigen, die sich auf die Stammdaten des Bildschirms beziehen. Beispielsweise soll eine Bildschirmvorlage zur Anzeige eines Auftrags auch die zugehörigen Auftragspositionen anzeigen. Um diese Funktion zu aktivieren, legen Sie die SupportsChildCollections-Eigenschaft fest. Wenn Sie diese auf True setzen, werden alle verwandten Auflistungen für den Stammdatentyp im Dialogfeld Bildschirm hinzufügen angezeigt, sodass ein Entwickler entscheiden kann, diese in den Bildschirm einzubeziehen.

Im folgenden Beispiel ist die SupportsChildCollections-Eigenschaft auf True festgelegt. Damit untergeordnete Auflistungen deaktiviert werden, sollten Sie dies in False ändern:

Public ReadOnly Property SupportsChildCollections As Boolean Implements IScreenTemplateMetadata.SupportsChildCollections
            Get
                Return True
            End Get
        End Property
public bool SupportsChildCollections
        {
            get { return true; }
        }

Generieren einer Struktur der Bildschirminhalte

In der Regel befindet sich der Großteil des Codes für eine Bildschirmvorlage in der Generate-Methode. Diese Methode kann verwendet werden, um Daten, Code oder Steuerelemente für Bildschirme hinzuzufügen, die auf der Vorlage basieren. LightSwitch enthält Basiselemente für den Bildschirm, wie z. B. Bildschirmbefehle. Sie können die Hierarchie der Inhaltselemente ändern und Elemente mithilfe der verfügbaren Speichermodellklassen – wie ContentItem und verwandte Klassen – erstellen.

LightSwitch enthält einen Verweis auf den Generierungshost von Bildschirmvorlagen, dessen Funktionalität vom Generierungscode beim Erstellen eines Bildschirms verwendet werden kann. Ein Teil dieser Funktionalität ist nur bei Verwendung mit dem Host verfügbar. Falls Sie unsicher sind, welche Strukturen Sie erstellen möchten, wird empfohlen, in LightSwitch einen Beispielbildschirm zu erstellen. Anschließend können Sie die LSML-Datei im Projektordner Common untersuchen und sehen, auf welche Weise der Bildschirm von LightSwitch generiert wurde.

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen eines Inhaltselements zu den Stammdaten eines Bildschirms

Ein Inhaltselement stellt ein LightSwitch-Steuerelement auf dem Bildschirm dar. Der folgende Code in der Generate-Methode zeigt, wie für den primären Datenmember eines Bildschirms ein Inhaltselement im Stamm des Bildschirms hinzugefügt wird. Dabei kann es sich um eine Auflistung oder eine einzelne Entität handeln, je nach Typ der Bildschirmvorlage.

Dim primaryDataControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, host.MakeUniqueLegalNameForContentItem("My Root Data"), host.PrimaryDataSourceProperty)
ContentItem primaryDataControl = host.AddContentItem(host.ScreenLayoutContentItem, host.MakeUniqueLegalNameForContentItem("My Root Data"), host.PrimaryDataSourceProperty);

Hh304432.collapse_all(de-de,VS.140).gifAngeben eines bestimmten Steuerelements für ein Inhaltselement

Steuerelemente werden über ViewID identifiziert. Dabei handelt es sich um eine Kombination aus dem Namen des Steuerelements und der Modulbezeichnung, in dem dieses definiert ist. Eine Liste mit ViewIDs finden Sie unter LightSwitch-Steuerelement ViewIDs.

Der folgende Code veranschaulicht, wie der Steuerelementtyp von ContentItem als DataGrid festgelegt wird.

host.SetContentItemView(primaryDataControl, "Microsoft.LightSwitch.RichClient:DataGrid")
host.SetContentItemView(primaryDataControl, "Microsoft.LightSwitch.RichClient:DataGrid");

LightSwitch verwendet zum Beispiel für das Steuerelement, das für ein bestimmtes Inhaltselement verwendet werden soll, und dessen Standardeigenschaftswerte intelligente Standardwerte. Intelligente Standardwerte berücksichtigen auch den Datentyp eines Steuerelements, ob es sich in der Inhaltsstruktur befindet, welche übergeordneten Steuerelemente dafür vorhanden sind usw. Wird ein Inhaltselement auf ein bestimmtes Steuerelement festgelegt, verwendet LightSwitch anstelle der Standardwerte diese Auswahl (außer sie ist ungültig). Der Datentyp eines bestimmten Felds kann ein benutzerdefinierter Typ sein, über den Sie nichts wissen, und eine Standardzuordnung zu einem Steuerelement aufweisen, über das Sie nichts wissen. Außerdem kann ein Entwickler ggf. die standardmäßig ausgewählten Steuerelemente in bestimmten Situationen überschreiben. Daher wird empfohlen, ein bestimmtes Steuerelement nur für ein Inhaltselement festzulegen, wenn dieses Steuerelement in allen Fällen verwendet werden soll.

Hh304432.collapse_all(de-de,VS.140).gifErweitern der untergeordneten Elemente eines Inhaltselements

Häufig ist es erforderlich, ein Inhaltselement zu erweitern und untergeordnete Elemente für alle Felder in der gebundenen Entität hinzuzufügen. Es wird empfohlen, dass Sie dazu host.ExpandContentItem aufrufen, anstatt dies manuell auszuführen. Mit diesem Aufruf werden die standardmäßig untergeordneten Elemente für dieses Steuerelement automatisch konsistent und korrekt generiert. Im folgenden Beispiel wird von ExpandContentItem das standardmäßig untergeordnete Element (DataGridRow) zu DataGrid hinzugefügt. Außerdem werden die standardmäßig untergeordneten Elemente für DataGridRow hinzugefügt. Dies entspricht der Verwendung von Zurücksetzen im Bildschirm-Designer von LightSwitch.

host.ExpandContentItem(primaryDataControl)
host.ExpandContentItem(primaryDataControl);

Hh304432.collapse_all(de-de,VS.140).gifFestlegen von Steuerelementeigenschaften auf nicht standardmäßige Werte

LightSwitch unterstützt ein Vererbungsmuster für Steuerelemente. Eigenschaften können auf unterschiedlichen Ebenen der Vererbungshierarchie definiert werden. Beispielsweise erben alle LightSwitch-Steuerelemente von Microsoft.LightSwitch.RichClient:RootControl, das allgemeine Eigenschaften für Größenänderungen bei Steuerelementen aufweist (horizontale und vertikale Ausrichtung, Höhe, Breite usw.). Um eine Eigenschaft für ein Steuerelement festzulegen, müssen Sie wissen, auf welchem Steuerelementtyp die Eigenschaft definiert wurde. Eine Liste mit integrierten LightSwitch-Steuerelementeigenschaften finden Sie unter Definieren, Überschreiben und Verwenden von LightSwitch-Steuerelementeigenschaften.

Im folgenden Beispiel werden die Eigenschaften VerticalAlignment und HeightSizingMode für ein Bildschirmsteuerelement festgelegt.

host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "HeightSizingMode", "Auto")
host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "HeightSizingMode", "Auto");

Es wird empfohlen, nur Werte für Eigenschaften festzulegen, wenn diese bestimmten Werte obligatorisch verwendet werden müssen. In diesem Fall ermittelt LightSwitch keine Standardwerte für die Eigenschaften auf Basis des Kontexts in der Struktur der Bildschirminhalte.

Hh304432.collapse_all(de-de,VS.140).gifFestlegen des Anzeigenamens für ein Inhaltselement oder einen Bildschirmmember

Im folgenden Beispiel wird der Anzeigename für ein Inhaltselement festgelegt. Das Beispiel kann auch verwendet werden, um den Anzeigenamen für einen Bildschirmmember festzulegen.

host.SetDisplayName(primaryDataControl, "Main Screen Data")
host.SetDisplayName(primaryDataControl, "Main Screen Data");

Falls kein Name festgelegt wird, stellt LightSwitch einen standardmäßigen Anzeigenamen auf Basis der Daten bereit, an die das Inhaltselement gebunden ist.

Hh304432.collapse_all(de-de,VS.140).gifFestlegen von Eigenschaften auf Bildschirm-Datenmembern

Im folgenden Beispiel wird die DisablePaging-Eigenschaft für einen Bildschirm-Datenmember festgelegt. ScreenCollectionProperty stellt einen Bildschirmmember des Typs Auflistung dar, und ScreenProperty steht für einen Skalartyp (Entität oder einfacher Datentyp).

DirectCast(host.PrimaryDataSourceProperty, ScreenCollectionProperty).DisablePaging = True
((ScreenCollectionProperty)host.PrimaryDataSourceProperty).DisablePaging = true;

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen von Bildschirmmembern

Im folgenden Beispiel wird dem Bildschirm eine Zeichenfolgeneigenschaft hinzugefügt.

' Add a screen member.
            Dim screenProperty As ScreenProperty = host.AddScreenProperty("Microsoft.LightSwitch:String", "NewScreenProperty")
// Add a screen member.
            ScreenProperty screenProperty = host.AddScreenProperty("Microsoft.LightSwitch:String", "NewScreenProperty") as ScreenProperty;

Hh304432.collapse_all(de-de,VS.140).gifAnzeigen des ausgewählten Elements einer Auflistung

Im folgenden Beispiel wird dem Bildschirm das ausgewählten Element einer Bildschirmauflistung hinzugefügt.

' Get the data type of your property.
            Dim collectionProperty As ScreenCollectionProperty = DirectCast(host.PrimaryDataSourceProperty, ScreenCollectionProperty)
            Dim collectionDataType As IEntityType = host.FindGlobalModelItem(Of ISequenceType)(collectionProperty.PropertyType).ElementType

            ' Create an expression that represents accessing the selected item on your collection property.
            Dim chain As ChainExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id))
            host.AppendMemberExpression(chain, "SelectedItem")

            ' Add a content item representing the selected item and set its view to a RowsLayout.
            Dim detailControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "ItemDetail", ContentItemKind.Details, chain, collectionDataType)
            host.SetContentItemView(detailControl, "Microsoft.LightSwitch.RichClient:RowsLayout")
            host.SetControlPropertyValue(detailControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            host.ExpandContentItem(detailControl)
// Get the data type of your property.
            ScreenCollectionProperty collectionProperty = (ScreenCollectionProperty)(host.PrimaryDataSourceProperty);
            IEntityType collectionDataType = host.FindGlobalModelItem<ISequenceType>(collectionProperty.PropertyType).ElementType as IEntityType; 
// Create an expression that represents accessing the selected item on your collection property.
            ChainExpression chain = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id));
            host.AppendMemberExpression(chain, "SelectedItem");

            // Add a content item representing the selected item and set its view to a RowsLayout.
            ContentItem detailControl = host.AddContentItem(host.ScreenLayoutContentItem, "ItemDetail", ContentItemKind.Details, chain, collectionDataType);
            host.SetContentItemView(detailControl, "Microsoft.LightSwitch.RichClient:RowsLayout");
            host.SetControlPropertyValue(detailControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            host.ExpandContentItem(detailControl);

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen eines Gruppensteuerelements

Im folgenden Beispiel wird dem Bildschirm ein Gruppensteuerelement hinzugefügt.

'Add a tabs group to the screen.
            Dim tabsGroup As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "TabsGroup", ContentItemKind.Group)
            host.SetContentItemView(tabsGroup, "Microsoft.LightSwitch.RichClient:TabsLayout")
// Add a tabs group to the screen.
            ContentItem tabsGroup = host.AddContentItem(host.ScreenLayoutContentItem, "TabsGroup", ContentItemKind.Group);
            host.SetContentItemView(tabsGroup, "Microsoft.LightSwitch.RichClient:TabsLayout");

Hh304432.collapse_all(de-de,VS.140).gifZugreifen auf verwandte Auflistungen

Wenn dies vom Entwickler so angegeben ist, können weitere verwandte Auflistungen zum Bildschirm hinzugefügt werden. Beispielsweise möchte der Entwickler, dass bei der Anzeige von Aufträgen auch die Auftragspositionen berücksichtigt werden. Das folgende Beispiel zeigt, wie verwandte Auflistungen zum Bildschirm hinzugefügt werden. Bei diesem Code wird vorausgesetzt, dass Sie bereits den Code aus dem vorherigen Beispiel "Hinzufügen eines Gruppensteuerelements" ergänzt haben.

For Each p As ScreenCollectionProperty In host.ChildCollectionProperties
                'Display each child collection as a grid.
                Dim currentTab As ContentItem = host.AddContentItem(tabsGroup, host.MakeUniqueLegalNameForContentItem("Tab"), p)
                host.SetContentItemView(currentTab, "Microsoft.LightSwitch.RichClient:DataGrid")
                host.ExpandContentItem(currentTab)
            Next
foreach (ScreenCollectionProperty p in host.ChildCollectionProperties)
            {
                // Display each child collection as a grid.
                ContentItem currentTab = host.AddContentItem(tabsGroup, host.MakeUniqueLegalNameForContentItem("Tab"), p);
                host.SetContentItemView(currentTab, "Microsoft.LightSwitch.RichClient:DataGrid");
                host.ExpandContentItem(currentTab);
            }

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen von Abfrageparametern

Wenn die für den Bildschirm ausgewählten Hauptdaten eine Abfrage sind, sind möglicherweise Parameter enthalten. Im folgenden Beispiel wird veranschaulicht, wie einem Bildschirm Parameter hinzugefügt werden.

'Add parameters to the screen.
            Dim parameterGroup As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "ParameterGroup", ContentItemKind.Group)
            host.SetContentItemView(parameterGroup, "Microsoft.LightSwitch.RichClient:ColumnsLayout")
            host.SetControlPropertyValue(parameterGroup, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            For Each param As ScreenPropertyBase In host.PrimaryDataSourceParameterProperties
                host.AddContentItem(parameterGroup, param.Name, param)
            Next
// Add parameters to the screen.
            ContentItem parameterGroup = host.AddContentItem(host.ScreenLayoutContentItem, "ParameterGroup", ContentItemKind.Group);
            host.SetContentItemView(parameterGroup, "Microsoft.LightSwitch.RichClient:ColumnsLayout");
            host.SetControlPropertyValue(parameterGroup, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            foreach (ScreenPropertyBase param in host.PrimaryDataSourceParameterProperties)
            {
                host.AddContentItem(parameterGroup, param.Name, param);
            }

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen eines Felds aus einer Entität

Möglicherweise müssen Sie ein bestimmtes Feld aus einer Entität ermitteln und einem Bildschirm hinzufügen. Das folgende Beispiel veranschaulicht, wie Sie die Definition einer Entität finden und ein bestimmtes Feld aus dem ausgewählten Element hinzufügen. Beachten Sie, dass der erste Codeblock Code aus dem früheren Beispiel "Anzeigen des ausgewählten Elements einer Auflistung" dupliziert.

'Find field called "Name"
            Dim nameProperty As IEntityPropertyDefinition = collectionDataType.Properties.Where(Function(p) p.Name.ToLower = "name").FirstOrDefault()
            If nameProperty IsNot Nothing Then
                'expression used to access collectionproperty.SelectedItem.Name
                Dim nameExpression As ChainExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id))
                host.AppendMemberExpression(nameExpression, "SelectedItem")
                host.AppendMemberExpression(nameExpression, nameProperty.Name)
                Dim namePropertyControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem,
                                                                             host.MakeUniqueLegalNameForContentItem("Name"),
                                                                             ContentItemKind.Value,
                                                                             nameExpression,
                                                                             nameProperty.PropertyType)
                host.SetControlPropertyValue(namePropertyControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            End If
// Find field called "Name".
            IEntityPropertyDefinition nameProperty = collectionDataType.Properties.Where(p => p.Name.ToLower() == "name").FirstOrDefault();
            if (nameProperty != null)
            {
                // Expression used to access collectionproperty.SelectedItem.Name
                ChainExpression nameExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id));
                host.AppendMemberExpression(nameExpression, "SelectedItem");
                host.AppendMemberExpression(nameExpression, nameProperty.Name);
                ContentItem namePropertyControl = host.AddContentItem(host.ScreenLayoutContentItem,
                                                                             host.MakeUniqueLegalNameForContentItem("Name"),
                                                                             ContentItemKind.Value,
                                                                             nameExpression,
                                                                             nameProperty.PropertyType);
                host.SetControlPropertyValue(namePropertyControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            }

Wenn Ihr Ziel darin besteht, alle oder die meisten Felder einer Entität anzuzeigen, ist es am besten, einen Detail-Knoten zu erstellen und host.ExpandContentItem zu verwenden. Die Ergebnisse können Sie bei Bedarf modifizieren.

Hh304432.collapse_all(de-de,VS.140).gifHinzufügen von Code zum Bildschirm

Mit der host.AddScreenCodeBehind-Methode veranlassen Sie das Vorlagenmodul, Code-Behind-Bausteine während der Bildschirmerstellung hinzuzufügen. Der Entwickler kann diesen Code ändern. Code muss als sprachspezifische Zeichenfolge bereitgestellt werden. Daher ist für jede Sprache, die Sie aktivieren möchten (derzeit werden C# und Visual Basic unterstützt), eine Codezeichenfolge bereitzustellen. Im folgenden Beispiel wird die Möglichkeit veranschaulicht, dies mithilfe eines Wörterbuchs zu erreichen. Das Wörterbuch setzt die Codierungssprache in eine formatierte Zeichenfolge um, die den Code für diese Sprache enthält. Zuerst wird dem Bildschirm eine lokale Eigenschaft des Typs String hinzugefügt. Anschließend wird der Code-Behind hinzugefügt, um den Wert in der InitializeDataWorkspace-Methode festzulegen. Das folgende Beispiel zeigt das Wörterbuch an, das den Code-Behind für Visual Basic und C# enthält.

Private Shared _codeTemplates As Dictionary(Of CodeLanguage, String) = New Dictionary(Of CodeLanguage, String)() From
        {
            {CodeLanguage.CSharp, _
                "" _
                + "{0}namespace {1}" _
                + "{0}{{" _
                + "{0}    public partial class {2}" _
                + "{0}    {{" _
                + "{0}" _
                + "{0}        partial void {2}_InitializeDataWorkspace(global::System.Collections.Generic.List<global::Microsoft.LightSwitch.IDataService> saveChangesTo)" _
                + "{0}        {{" _
                + "{0}            this.{3} = ""Hello World"";" _
                + "{0}        }}" _
                + "{0}" _
                + "{0}    }}" _
                + "{0}}}"
            }, _
            {CodeLanguage.VB, _
                "" _
                + "{0}Namespace {1}" _
                + "{0}" _
                + "{0}    Public Class {2}" _
                + "{0}" _
                + "{0}        Private Sub {2}_InitializeDataWorkspace(ByVal saveChangesTo As Global.System.Collections.Generic.List(Of Global.Microsoft.LightSwitch.IDataService))" _
                + "{0}            Me.{3} = ""Hello World""" _
                + "{0}        End Sub" _
                + "{0}" _
                + "{0}    End Class" _
                + "{0}" _
                + "{0}End Namespace" _
            }
        }
private static Dictionary<CodeLanguage, String> _codeTemplates = new Dictionary<CodeLanguage, String>()
        {
            {CodeLanguage.CSharp,
                ""
                + "{0}namespace {1}"
                + "{0}{{"
                + "{0}    public partial class {2}"
                + "{0}    {{"
                + "{0}"
                + "{0}        partial void {2}_InitializeDataWorkspace(global::System.Collections.Generic.List<global::Microsoft.LightSwitch.IDataService> saveChangesTo)"
                + "{0}        {{"
                + "{0}            this.{3} = \"Hello World\";"
                + "{0}        }}"
                + "{0}"
                + "{0}    }}"
                + "{0}}}"
            },
            {CodeLanguage.VB,
                ""
                + "{0}Namespace {1}"
                + "{0}"
                + "{0}    Public Class {2}"
                + "{0}"
                + "{0}        Private Sub {2}_InitializeDataWorkspace(ByVal saveChangesTo As Global.System.Collections.Generic.List(Of Global.Microsoft.LightSwitch.IDataService))"
                + "{0}            Me.{3} = \"Hello World\""
                + "{0}        End Sub"
                + "{0}"
                + "{0}    End Class"
                + "{0}"
                + "{0}End Namespace"
            }
        };

Der folgende Code muss der Generate-Methode ebenfalls hinzugefügt werden:

' Code Generation
            Dim codeTemplate As String = ""
            If _codeTemplates.TryGetValue(host.ScreenCodeBehindLanguage, codeTemplate) Then
                host.AddScreenCodeBehind(String.Format(codeTemplate,
                                                       Environment.NewLine,
                                                       host.ScreenNamespace,
                                                       host.ScreenName,
                                                       screenProperty.Name))
            End If
// Code Generation
            string codeTemplate = "";
            if (_codeTemplates.TryGetValue(host.ScreenCodeBehindLanguage, out codeTemplate))
            {
                host.AddScreenCodeBehind(String.Format(codeTemplate,
                                                       Environment.NewLine,
                                                       host.ScreenNamespace,
                                                       host.ScreenName,
                                                       screenProperty.Name));
            }

Codelisting

Nachfolgend finden Sie eine vollständige Codeauflistung für eine Bildschirmvorlage mit dem Namen "TestTemplate" mit dem gesamten Code dieses Themas.

Imports System
Imports System.Collections.Generic
Imports System.ComponentModel.Composition
Imports System.Text

Imports Microsoft.LightSwitch.Designers.ScreenTemplates.Model
Imports Microsoft.LightSwitch.Model.Storage
Imports Microsoft.LightSwitch.Model
Imports System.Management

Namespace ScreenTemplates

    Public Class TestTemplate
        Implements IScreenTemplate

#Region "IScreenTemplate Members"

        Public Sub Generate(host As IScreenTemplateHost) Implements IScreenTemplate.Generate
            Dim primaryDataControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, host.MakeUniqueLegalNameForContentItem("My Root Data"), host.PrimaryDataSourceProperty)
            host.SetContentItemView(primaryDataControl, "Microsoft.LightSwitch.RichClient:DataGrid")
            host.ExpandContentItem(primaryDataControl)

            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "HeightSizingMode", "Auto")
            host.SetDisplayName(primaryDataControl, "Main Screen Data")

            DirectCast(host.PrimaryDataSourceProperty, ScreenCollectionProperty).DisablePaging = True

            'Get the data type of your property
            Dim collectionProperty As ScreenCollectionProperty = DirectCast(host.PrimaryDataSourceProperty, ScreenCollectionProperty)
            Dim collectionDataType As IEntityType = host.FindGlobalModelItem(Of ISequenceType)(collectionProperty.PropertyType).ElementType

            'Create an expression that represents accessing the selected item on your collection property
            Dim chain As ChainExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id))
            host.AppendMemberExpression(chain, "SelectedItem")

            'Add a content item representing the selected item and set its view to a RowsLayout
            Dim detailControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "ItemDetail", ContentItemKind.Details, chain, collectionDataType)
            host.SetContentItemView(detailControl, "Microsoft.LightSwitch.RichClient:RowsLayout")
            host.SetControlPropertyValue(detailControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            host.ExpandContentItem(detailControl)

            'Add parameters to the screen.
            Dim parameterGroup As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "ParameterGroup", ContentItemKind.Group)
            host.SetContentItemView(parameterGroup, "Microsoft.LightSwitch.RichClient:ColumnsLayout")
            host.SetControlPropertyValue(parameterGroup, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            For Each param As ScreenPropertyBase In host.PrimaryDataSourceParameterProperties
                host.AddContentItem(parameterGroup, param.Name, param)
            Next

            'Find field called "Name".
            Dim nameProperty As IEntityPropertyDefinition = collectionDataType.Properties.Where(Function(p) p.Name.ToLower = "name").FirstOrDefault()
            If nameProperty IsNot Nothing Then
                'expression used to access collectionproperty.SelectedItem.Name
                Dim nameExpression As ChainExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id))
                host.AppendMemberExpression(nameExpression, "SelectedItem")
                host.AppendMemberExpression(nameExpression, nameProperty.Name)
                Dim namePropertyControl As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem,
                                                                             host.MakeUniqueLegalNameForContentItem("Name"),
                                                                             ContentItemKind.Value,
                                                                             nameExpression,
                                                                             nameProperty.PropertyType)
                host.SetControlPropertyValue(namePropertyControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top")
            End If

            'Add a tabs group to the screen.
            Dim tabsGroup As ContentItem = host.AddContentItem(host.ScreenLayoutContentItem, "TabsGroup", ContentItemKind.Group)
            host.SetContentItemView(tabsGroup, "Microsoft.LightSwitch.RichClient:TabsLayout")

            For Each p As ScreenCollectionProperty In host.ChildCollectionProperties
                'Display each child collection as a grid
                Dim currentTab As ContentItem = host.AddContentItem(tabsGroup, host.MakeUniqueLegalNameForContentItem("Tab"), p)
                host.SetContentItemView(currentTab, "Microsoft.LightSwitch.RichClient:DataGrid")
                host.ExpandContentItem(currentTab)
            Next

            'Add a screen member.
            Dim screenProperty As ScreenProperty = host.AddScreenProperty("Microsoft.LightSwitch:String", "NewScreenProperty")

            'Code Generation
            Dim codeTemplate As String = ""
            If _codeTemplates.TryGetValue(host.ScreenCodeBehindLanguage, codeTemplate) Then
                host.AddScreenCodeBehind(String.Format(codeTemplate,
                                                       Environment.NewLine,
                                                       host.ScreenNamespace,
                                                       host.ScreenName,
                                                       screenProperty.Name))
            End If



        End Sub

        Private Shared _codeTemplates As Dictionary(Of CodeLanguage, String) = New Dictionary(Of CodeLanguage, String)() From
        {
            {CodeLanguage.CSharp, _
                "" _
                + "{0}namespace {1}" _
                + "{0}{{" _
                + "{0}    public partial class {2}" _
                + "{0}    {{" _
                + "{0}" _
                + "{0}        partial void {2}_InitializeDataWorkspace(global::System.Collections.Generic.List<global::Microsoft.LightSwitch.IDataService> saveChangesTo)" _
                + "{0}        {{" _
                + "{0}            this.{3} = ""Hello World"";" _
                + "{0}        }}" _
                + "{0}" _
                + "{0}    }}" _
                + "{0}}}"
            }, _
            {CodeLanguage.VB, _
                "" _
                + "{0}Namespace {1}" _
                + "{0}" _
                + "{0}    Public Class {2}" _
                + "{0}" _
                + "{0}        Private Sub {2}_InitializeDataWorkspace(ByVal saveChangesTo As Global.System.Collections.Generic.List(Of Global.Microsoft.LightSwitch.IDataService))" _
                + "{0}            Me.{3} = ""Hello World""" _
                + "{0}        End Sub" _
                + "{0}" _
                + "{0}    End Class" _
                + "{0}" _
                + "{0}End Namespace" _
            }
        }

        Public ReadOnly Property Description As String Implements IScreenTemplateMetadata.Description
            Get
                Return "Test Template Description"
            End Get
        End Property

        Public ReadOnly Property DisplayName As String Implements IScreenTemplateMetadata.DisplayName
            Get
                Return "Test Template"
            End Get
        End Property

        Public ReadOnly Property PreviewImage As Uri Implements IScreenTemplateMetadata.PreviewImage
            Get
                Return New Uri("/ScreenTemplateExtension.Design;component/Resources/ScreenTemplateImages/TestTemplateLarge.png", UriKind.Relative)
            End Get
        End Property

        Public ReadOnly Property RootDataSource As RootDataSourceType Implements IScreenTemplateMetadata.RootDataSource
            Get
                Return RootDataSourceType.Collection
            End Get
        End Property

        Public ReadOnly Property ScreenNameFormat As String Implements IScreenTemplateMetadata.ScreenNameFormat
            Get
                Return "{0}TestTemplate"
            End Get
        End Property

        Public ReadOnly Property SmallIcon As Uri Implements IScreenTemplateMetadata.SmallIcon
            Get
                Return New Uri("/ScreenTemplateExtension.Design;component/Resources/ScreenTemplateImages/TestTemplateSmall.png", UriKind.Relative)
            End Get
        End Property

        Public ReadOnly Property SupportsChildCollections As Boolean Implements IScreenTemplateMetadata.SupportsChildCollections
            Get
                Return True
            End Get
        End Property

        Public ReadOnly Property TemplateName As String Implements IScreenTemplateMetadata.TemplateName
            Get
                Return TestTemplate.TemplateId
            End Get
        End Property

#End Region

#Region "Constants"

        Friend Const TemplateId As String = "ScreenTemplateExtension:TestTemplate"

#End Region

    End Class

    <Export(GetType(IScreenTemplateFactory))>
    <Template(TestTemplate.TemplateId)>
    Friend Class TestTemplateFactory
        Implements IScreenTemplateFactory

#Region "IScreenTemplateFactory Members"

        Public Function CreateScreenTemplate() As IScreenTemplate Implements IScreenTemplateFactory.CreateScreenTemplate
            Return New TestTemplate()
        End Function

#End Region

    End Class

End Namespace
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Management;
using System.Text;

using Microsoft.LightSwitch.Designers.ScreenTemplates.Model;
using Microsoft.LightSwitch.Model;
using Microsoft.LightSwitch.Model.Storage;

namespace ScreenTemplateExtension.ScreenTemplates
{
    public class TestTemplate : IScreenTemplate
    {
        #region IScreenTemplate Members

        public void Generate(IScreenTemplateHost host)
        {
            ContentItem primaryDataControl = host.AddContentItem(host.ScreenLayoutContentItem, host.MakeUniqueLegalNameForContentItem("My Root Data"), host.PrimaryDataSourceProperty);
            host.SetContentItemView(primaryDataControl, "Microsoft.LightSwitch: .RichClient DataGrid");
            host.ExpandContentItem(primaryDataControl);

            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            host.SetControlPropertyValue(primaryDataControl, "Microsoft.LightSwitch.RichClient:RootControl", "HeightSizingMode", "Auto");
            host.SetDisplayName(primaryDataControl, "Main Screen Data");

            ((ScreenCollectionProperty)host.PrimaryDataSourceProperty).DisablePaging = true;

            // Get the data type of your property.
            ScreenCollectionProperty collectionProperty = (ScreenCollectionProperty)(host.PrimaryDataSourceProperty);
            IEntityType collectionDataType = host.FindGlobalModelItem<ISequenceType>(collectionProperty.PropertyType).ElementType as IEntityType;

            // Create an expression that represents accessing the selected item on your collection property.
            ChainExpression chain = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id));
            host.AppendMemberExpression(chain, "SelectedItem");

            // Add a content item representing the selected item and set its view to a RowsLayout.
            ContentItem detailControl = host.AddContentItem(host.ScreenLayoutContentItem, "ItemDetail", ContentItemKind.Details, chain, collectionDataType);
            host.SetContentItemView(detailControl, "Microsoft.LightSwitch.RichClient:RowsLayout");
            host.SetControlPropertyValue(detailControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            host.ExpandContentItem(detailControl);

            // Add parameters to the screen.
            ContentItem parameterGroup = host.AddContentItem(host.ScreenLayoutContentItem, "ParameterGroup", ContentItemKind.Group);
            host.SetContentItemView(parameterGroup, "Microsoft.LightSwitch.RichClient:ColumnsLayout");
            host.SetControlPropertyValue(parameterGroup, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            foreach (ScreenPropertyBase param in host.PrimaryDataSourceParameterProperties)
            {
                host.AddContentItem(parameterGroup, param.Name, param);
            }

            // Find field called "Name".
            IEntityPropertyDefinition nameProperty = collectionDataType.Properties.Where(p => p.Name.ToLower() == "name").FirstOrDefault();
            if (nameProperty != null)
            {
                // Expression used to access collectionproperty.SelectedItem.Name
                ChainExpression nameExpression = host.CreateChainExpression(host.CreateMemberExpression(collectionProperty.Id));
                host.AppendMemberExpression(nameExpression, "SelectedItem");
                host.AppendMemberExpression(nameExpression, nameProperty.Name);
                ContentItem namePropertyControl = host.AddContentItem(host.ScreenLayoutContentItem,
                                                                             host.MakeUniqueLegalNameForContentItem("Name"),
                                                                             ContentItemKind.Value,
                                                                             nameExpression,
                                                                             nameProperty.PropertyType);
                host.SetControlPropertyValue(namePropertyControl, "Microsoft.LightSwitch.RichClient:RootControl", "VerticalAlignment", "Top");
            }

            // Add a tabs group to the screen.
            ContentItem tabsGroup = host.AddContentItem(host.ScreenLayoutContentItem, "TabsGroup", ContentItemKind.Group);
            host.SetContentItemView(tabsGroup, "Microsoft.LightSwitch.RichClient:TabsLayout");

            foreach (ScreenCollectionProperty p in host.ChildCollectionProperties)
            {
                // Display each child collection as a grid.
                ContentItem currentTab = host.AddContentItem(tabsGroup, host.MakeUniqueLegalNameForContentItem("Tab"), p);
                host.SetContentItemView(currentTab, "Microsoft.LightSwitch.RichClient:DataGrid");
                host.ExpandContentItem(currentTab);
            }

            // Add a screen member.
            ScreenProperty screenProperty = host.AddScreenProperty("Microsoft.LightSwitch:String", "NewScreenProperty") as ScreenProperty;

            // Code Generation
            string codeTemplate = "";
            if (_codeTemplates.TryGetValue(host.ScreenCodeBehindLanguage, out codeTemplate))
            {
                host.AddScreenCodeBehind(String.Format(codeTemplate,
                                                       Environment.NewLine,
                                                       host.ScreenNamespace,
                                                       host.ScreenName,
                                                       screenProperty.Name));
            }
        }

        private static Dictionary<CodeLanguage, String> _codeTemplates = new Dictionary<CodeLanguage, String>()
        {
            {CodeLanguage.CSharp,
                ""
                + "{0}namespace {1}"
                + "{0}{{"
                + "{0}    public partial class {2}"
                + "{0}    {{"
                + "{0}"
                + "{0}        partial void {2}_InitializeDataWorkspace(global::System.Collections.Generic.List<global::Microsoft.LightSwitch.IDataService> saveChangesTo)"
                + "{0}        {{"
                + "{0}            this.{3} = \"Hello World\";"
                + "{0}        }}"
                + "{0}"
                + "{0}    }}"
                + "{0}}}"
            },
            {CodeLanguage.VB,
                ""
                + "{0}Namespace {1}"
                + "{0}"
                + "{0}    Public Class {2}"
                + "{0}"
                + "{0}        Private Sub {2}_InitializeDataWorkspace(ByVal saveChangesTo As Global.System.Collections.Generic.List(Of Global.Microsoft.LightSwitch.IDataService))"
                + "{0}            Me.{3} = \"Hello World\""
                + "{0}        End Sub"
                + "{0}"
                + "{0}    End Class"
                + "{0}"
                + "{0}End Namespace"
            }
        };

        public string Description
        {
            get { return "TestTemplate Description"; }
        }

        public string DisplayName
        {
            get { return "Test Template"; }
        }

        public Uri PreviewImage
        {
            get { return new Uri("/ScreenTemplateExtension.Design;component/Resources/ScreenTemplateImages/TestTemplateLarge.png", UriKind.Relative); }
        }

        public RootDataSourceType RootDataSource
        {
            get { return RootDataSourceType.Collection; }
        }

        public string ScreenNameFormat
        {
            get { return "{0}TestTemplate"; }
        }

        public Uri SmallIcon
        {
            get { return new Uri("/ScreenTemplateExtension.Design;component/Resources/ScreenTemplateImages/TestTemplateSmall.png", UriKind.Relative); }
        }

        public bool SupportsChildCollections
        {
            get { return true; }
        }

        public string TemplateName
        {
            get { return TestTemplate.TemplateId; }
        }

        #endregion

        #region Constants

        internal const string TemplateId = "ScreenTemplateExtension:TestTemplate";

        #endregion
    }

    [Export(typeof(IScreenTemplateFactory))]
    [Template(TestTemplate.TemplateId)]
    internal class TestTemplateFactory : IScreenTemplateFactory
    {
        #region IScreenTemplateFactory Members

        IScreenTemplate IScreenTemplateFactory.CreateScreenTemplate()
        {
            return new TestTemplate();
        }

        #endregion
    }
}

Siehe auch

Aufgaben

Gewusst wie: Debuggen oder Testen einer LightSwitch-Erweiterung

Gewusst wie: Erstellen eines LightSwitch-Erweiterungsprojekts

Konzepte

LightSwitch-Steuerelement ViewIDs

Definieren, Überschreiben und Verwenden von LightSwitch-Steuerelementeigenschaften

LightSwitch-Erweiterbarkeits-Toolkit für Visual Studio 2013