Spezifikation eines Renderers für adaptive Karten
Die folgende Spezifikation beschreibt die Implementierung eines Renderers für adaptive Karten auf einer beliebigen nativen Benutzeroberflächenplattform.
Wichtig
Dieser Inhalt ist noch in Bearbeitung, und möglicherweise fehlen noch einige Details. Mit Fragen oder Feedback können Sie sich gerne an uns wenden.
Analysieren von JSON
Fehlerbedingungen
- Ein Parser MUSS prüfen, ob es sich um gültigen JSON-Inhalt handelt.
- Ein Parser MUSS eine Überprüfung anhand des Schemas (erforderliche Eigenschaften usw.) ausführen.
- Die oben genannten Fehler MÜSSEN der Host-App gemeldet werden (als Ausnahme oder eine entsprechende Angabe).
Unbekannte Typen
- Wenn unbekannte „Typen“ ermittelt werden, MÜSSEN DIESE AUS DEM ERGEBNIS GELÖSCHT werden.
- Alle Änderungen der Nutzlast (wie oben) SOLLTEN der Host-App als Warnungen gemeldet werden.
Unbekannte Eigenschaften
- Ein Parser MUSSzusätzliche Eigenschaften in Elementen einschließen.
Weitere Überlegungen
- Die Eigenschaft
speak
KANN SSML-Markup enthalten und MUSS wie angegeben an die Host-App zurückgegeben werden.
Analyse der Hostkonfiguration
- TODO
Versionsverwaltung
- Ein Renderer MUSS eine bestimmte Version des Schemas implementieren.
- Der
AdaptiveCard
-Konstruktor MUSS der Eigenschaftversion
einen Standardwert basierend auf der aktuellen Schemaversion zuweisen. - Wenn ein Renderer eine
version
-Eigenschaft in einerAdaptiveCard
findet, die höher ist als die unterstützte Version, MUSS er stattdessen denfallbackText
zurückgeben.
Darstellung
Eine AdaptiveCard
besteht aus einem body
- und einem actions
-Element. Der body
ist eine Sammlung von CardElement
-Elementen, die von einem Renderer enumeriert und in der entsprechenden Reihenfolge gerendert werden.
- Jedes Element MUSS auf die Breite des übergeordneten Elements gestreckt werden (ähnlich wie bei
display: block
in HTML). - Ein Renderer MUSS alle unbekannten Elementtypen, auf die er trifft, ignorieren und mit dem Rest der Nutzlast fortfahren.
Text, TextBlock und RichTextBlock
- Ein TextBlock MUSS eine einzelne Zeile aufnehmen, sofern die
wrap
-Eigenschaft nichttrue
lautet. - Der Textblock SOLLTE überschüssigen Text abschneiden und Auslassungspunkte (...) anzeigen.
Markdown
- Adaptive Karten lassen eine Teilmenge von Markdown zu und SOLLTEN in
TextBlock
unterstützt werden. - RichTextBlock unterstützt Markdown NICHT und muss mithilfe der verfügbar gemachten Eigenschaften formatiert werden.
- Weitere Informationen findest du unter Markdownanforderungen.
Formatierungsfunktionen
TextBlock
ermöglicht Formatierungsfunktionen für DATUM und UHRZEIT, die in jedem Renderer unterstützt werden MÜSSEN.- BEI ALLEN FEHLERN MUSS die unformatierte Zeichenfolge auf der Karte angezeigt werden. Es wird keine benutzerfreundliche Meldung angezeigt. (Ziel hierbei ist es, den Entwickler sofort darauf aufmerksam zu machen, dass ein Problem vorliegt).
Bilder
- Ein Renderer SOLLTE Host-Apps informieren, wenn alle HTTP-Bilder heruntergeladen wurden und die Karte „vollständig gerendert“ ist.
- Ein Renderer MUSS beim Herunterladen von HTTP-Bildern den Hostkonfigurationsparameter
maxImageSize
überprüfen. - Ein Renderer MUSS
.png
und.jpeg
unterstützen. - Ein Renderer SOLLTE
.gif
-Bilder unterstützen.
Erweitertes Layoutverhalten
Der Renderer MUSS beim Rendern von Kartenelementen hinsichtlich der in diesem Dokument erwähnten Attribute die folgenden Verhaltensweisen berücksichtigen.
Der Renderer sollte Einschränkungen verwalten und dabei die verschiedenen Faktoren berücksichtigen wie Rand, Abstand, Höhe und Breite usw. sowie die Konfiguration der Kartenelemente und ihrer untergeordneten Elemente.
Breite
- Zulässige Werte:
auto
,stretch
und feste Werte in Bezug aufpixels
undweight
auto
bietet ausreichend Platz für die Ausdehnung der Breite (unterstützt minimale Ausdehnung )stretch
nimmt die verbleibende Breite in Anspruch (unterstützt die maximale Ausdehnung )
In den folgenden Szenarien wird beschrieben, wie sich unterschiedliche Breitenkombinationen für Spalten auf die Einschränkungen auswirken.
auto
vs stretch
- Spalten mit einer
auto
- undstretch
-Breite.
- Die erste Spalte mit
auto
-Breite verwendet ausreichend Platz, um den Inhalt anzuzeigen, und die zweite Spalte mitstretch
-Breite nimmt den gesamte Platz ein.
- Spalten mit nur
stretch
-Breite
- Spalten mit nur „stretch“-Breite nehmen den verbleibenden Platz ein, nachdem sie den Platz gleichmäßig untereinander aufgeteilt haben.
auto
,stretch
undauto
Die Breite der ersten und dritten Spalte wird zuerst so angepasst, dass die Elemente ausreichend aufgenommen werden, und die zweite Spalte mit „stretch“-Breite beansprucht den verbleibenden Platz.
- Reihenfolge der Anzeige von Elementen mit Spalten mit
auto
-Breite
- Spalten mit
auto
-Breite positionieren sich selbst so, dass ausreichend Platz vorhanden ist, um den zu rendernden Inhalt aufzunehmen. - Im Falle von Bildansichten werden Bilder so herunterskaliert, dass sie in die verbleibende Breite passen.
- Hinweis: Bilder werden nur für die Bildgrößen
stretch
undauto
herunterskaliert, aber nicht für feste Breiten und Höhen in Pixel.
weights
vs pixels
- Spalten mit Kombination aus
weight
- undpixel
-Breite
- Die obige Karte enthält drei Spalten mit der folgenden Breitenkonfiguration:
Column1: Weight 50
,Column2: 100px
Column3: Weight 50
- Die Breite von Spalte 2 wird vom
pixel value
bestimmt. - Die Breite von Spalte 1 und 3 wird auf Grundlage von
weights
und der berechnetenweight ratio
angepasst.
- Spalten mit den Attributen
weight
,pixel width
undauto
- Die obige Karte enthält vier Spalten mit der folgenden Breitenkonfiguration:
Column1: Weight 50
,Column2: 100px
,Column3: Weight 50
undColumn4: auto
- Hinweis: Eine Bildansicht mit einer Spalte mit
auto
-Breite wird so herunterskaliert, dass sie in den verbleibenden Platz passt.
Die Rangfolge der Anzeige von Elementen mit „width“-Attribut
px
> weight
> auto
> stretch
Höhe
Zulässige Werte: auto
und stretch
In den folgenden Szenarien wird beschrieben, wie sich unterschiedliche Breitenkombinationen für Spalten auf die Einschränkungen auswirken.
- Elemente dehnen sich vertikal frei aus, wenn die Karte keine feste Höhe hat.
- Beide Spalten können sich unabhängig von
auto
- undstretch
-Werten ausreichend vertikal ausdehnen. - Dies ist der Fall bei für den Textblock deaktivierter Eigenschaft
wrap
.
- Bei der folgenden Karte ist für den Textblock die Eigenschaft
wrap
aktiviert.
Abstände und Trennzeichen
- Die
spacing
-Eigenschaft jedes Elements wirkt sich darauf aus, wie viel Abstand zwischen dem AKTUELLEN Element und dem Element DAVOR vorhanden ist. - Ein Abstand DARF NUR DANN angewendet werden, wenn vor dem Element tatsächlich ein anderes Element vorhanden ist. (Diese Eigenschaft gilt also nicht für das erste Element in einem Array).
- Ein Renderer MUSS den zu verwendenden Abstand aus
hostConfig
für den Enumerationswert ablesen, der auf das aktuelle Element angewendet wird. - Wenn das Element den
separator
-Werttrue
aufweist, MUSS eine sichtbare Linie zwischen dem aktuellen Element und dem Element davor gezeichnet werden. - Die Trennlinie MUSS mithilfe der Eigenschaft
container.style.default.foregroundColor
gezeichnet werden. - Eine Trennlinie DARF NUR gezeichnet werden, wenn das Element NICHT das erste Element im Array ist.
- Spacing (Abstände): Zulässige Werte:
none
,small
,default
,medium
,large
,extra large
undpadding
- Das Attribut „spacing“ fügt Abstand zwischen diesem Element und dem vorangehenden Element hinzu.
- Das Attribut „spacing“ hat keine Auswirkung, wenn es das erste Element im Ansichtscontainer ist.
- Die mit einem Pfeil markierten Elemente sind die ersten Elemente unter ihren nebengeordneten Elementen, sodass „spacing“ keine Auswirkung hat.
- Separator (Trennzeichen): Mögliche Werte: Ein-/Aus-Umschalter
- Zeichnet eine Trennlinie am oberen Rand des Elements.
- Kombination aus „spacing“ und „separator“
- Die Einschränkungen der Kombination aus „spacing“ und „separator“ sind unten dargestellt.
- Der Gesamtabstand wird in Bezug auf die angegebenen Werte beibehalten.
- Das Trennzeichen wird in der Mitte der Abstandsentfernung hinzugefügt.
[Hinweis: Der Abstand, bei dem das Trennzeichen in den Abstandsbereich eingefügt wird, muss bestätigt werden. Scheint die Mitte zu sein.]
Containerstile
- Stellt Formatierungshinweise für Container wie Spalten und Spaltensätze (ColumnSet) bereit.
- Zulässige Werte:
none
,default
,emphasis
,good
,attention
,warning
undaccent
- Diese vordefinierten Stiloptionen bieten Abstand für die Elemente innerhalb des Containers und die Hintergrundfarbe.
- Karte A veranschaulicht „columns“ und „columnset“ ohne Stiloptionen
- Karte B veranschaulicht „columnset“ mit dem Attention-Stil (Achtung). Beachten Sie den Abstand innerhalb des „columnset“-Containers und die Änderung der Hintergrundfarbe.
- Karte C veranschaulicht nur „columns“ mit Formatierung. Ähnlich wie im vorherigen Beispiel beinhaltet „columns“ Abstand und Änderung des Hintergrunds.
- Karte D veranschaulicht „columns“ und „columnset“, beide mit Stiloptionen.
[Hinweis: Die Methode zur Bestimmung des Abstands muss überprüft werden. Wird er vom Host bestimmt? ]
Bleed (Anschnitt)
- Diese Eigenschaft ermöglicht es einem Container wie „columns“ und „columnset“, in sein übergeordnetes Element überzugehen.
- Mögliche Werte:
on
undoff
.
- Karte A veranschaulicht „columns“ und „columnset“ mit normaler Formatierung.
- Karte B veranschaulicht die erste Spalte mit Option „bleed“. Der Inhalt schneidet so gerade die Ränder zu seinem übergeordneten Element an.
Bildgröße:
Size
-Attribut
- Zulässige Werte:
auto
,stretch
,small
,medium
,large
auto
: Bilder werden nach unten skaliert, soweit erforderlich, aber nicht nach oben skaliert, um den Bereich auszufüllen.stretch
: Bild, das sowohl nach unten skaliert als auch nach oben passt.small
undmedium
large
: Das Bild wird mit einer festen Breite angezeigt, wobei die Breite vom Host bestimmt wird.
auto
vsstretch
- Kombination aus Spaltenbreite und Bildgröße
- Im Allgemeinen ermöglichen Spalten mit
stretch
-Breite Bildern das freie Skalieren gemäß derstretch
-Größe. - Spalten mit
auto
-Breite gestatten es dem Bild, einen exakten Raum einzunehmen, unabhängig von derauto
- undstretch
-Größe des Bilds. - Die Spaltenbreite hat Vorrang bei der Bestimmung der Bildgröße in dieser Anordnung.
Bildattribut Width (in pixels)
- Dieses bietet die gewünschte Breite des Bilds auf dem Bildschirm.
- Die
size
-Eigenschaft wird außer Kraft gesetzt, wenn ein Wert angegeben wird.
- Die Spalte mit
auto
-Breite hat Vorrang vorstretch
bei der Bereitstellung von Raum für Bildinhalte in dieser Anordnung.
Kombination aus Spaltenbreite („weight“ und „pixel“) und Bildgröße („auto“ und „stretch“)
- Bilder mit
auto
-Größe nehmen ausreichend Platz zum Ausdehnen (oder für eine Herunterskalierung) ein, innerhalb der Spalteneinschränkungen durch die Breitenweight
undpixel
. - Bilder mit der
stretch
-Größe können so ausgedehnt werden, dass sie den verbleibenden Platz einnehmen, innerhalb der Einschränkungen durch die Spaltenbreitenweight
undpixel
.
Erweitertes Layout – Zusammenfassung
- Die Spaltenbreite hat Vorrang bei der Bestimmung der Größe des Bilds als seine Bildgröße („auto“, „stretch“, „min width“ usw).
- Die Rangfolge der Spaltenbreite, die zur ausreichenden Anzeige des Inhalts verwendet wird:
px
>weight
>auto
>stretch
- Bild-
size
(„auto“, „stretch“) wird ignoriert, wenn Bild-width
und -height
in Pixel (px) bereitgestellt werden. - Das Größenattribut
stretch
des Bilds führt nur dann zu einer Hochskalierung des Bilds, wenn noch Platz übrig ist und „auto“ der Spalte nicht den Wertauto
hat. - Ein Bild dehnt sich selbständig bis zu der Grenze aus, bei der es sein Seitenverhältnis in dem in der Spalte verfügbaren Raum beibehält. Die Höhe wiederum wird frei ausgedehnt.
- Das Attribut
Spacing
hat keine Auswirkung, wenn es das erste oder einzige Element unter seinen nebengeordneten Elementen ist.
Aktionen
- Ein Renderer DARF KEINE Aktionen rendern, wenn das
supportsInteractivity
-Element in der HostConfigfalse
ist. - Die
actions
-Eigenschaft MUSS als Schaltflächen auf einer Form von Aktionsleiste gerendert werden, üblicherweise am unteren Rand der Karte. - Wenn eine Schaltfläche aktiviert wird, MUSS die Host-App das Ereignis verarbeiten können.
- Das Ereignis MUSS alle zugeordneten Eigenschaften mit der Aktion übergeben.
- Das Ereignis MUSS die ausgeführte
AdaptiveCard
übergeben.
Aktion | Behavior |
---|---|
Action.OpenUrl | Öffnet eine externe URL zur Anzeige. |
Action.ShowCard | Fordert eine untergeordnete Karte an, die dem Benutzer angezeigt werden soll. |
Action.Submit | Fordert an, dass alle Eingabeelemente in einem Objekt zusammengefasst werden, das dir anschließend über eine von der Hostanwendung definierte Methode gesendet wird. |
Action.Execute | (In v1.4 eingeführt) Fordert an, dass alle Eingabeelemente in einem Objekt zusammengefasst werden, das anschließend über die „universelle Aktionspipeline“ an Sie gesendet wird. |
Action.OpenUrl
Action.OpenUrl
SOLLTE eine URL mithilfe des nativen Plattformmechanismus öffnen.- Wenn dies nicht möglich ist, MUSS die Aktion ein Ereignis auslösen, damit die Host-App das Öffnen der URL verarbeitet. Dieses Ereignis MUSS es der Host-App ermöglichen, das Standardverhalten zu überschreiben, beispielsweise durch Öffnen der URL innerhalb der eigenen App.
Action.ShowCard
Action.ShowCard
MUSS auf irgendeine Weise unterstützt werden, basierend auf der HostConfig-Einstellung. Es gibt zwei Modi: Inline und Popup. Inlinekarten SOLLTEN die Sichtbarkeit der Karte automatisch umschalten. Im Popupmodus SOLLTE ein Ereignis ausgelöst werden, damit die Host-App die Karte auf irgendeine Weise anzeigt.
Action.Submit
- Das
Action.Submit
-Element sammelt Eingabefelder, führt diese mit einem optionalen Datenfeld zusammen und sendet ein Ereignis an den Client. - Ein signifikanter Unterschied beim Verhalten des Elements zeigt sich zwischen Version 1.x und 2.x des ACL-Renderers.
Die Submit-Aktion verhält sich wie eine Übermittlungsaktion in einem HTML-Formular, mit einer Ausnahme: In HTML wird typischerweise eine HTTP-POST-Aktion ausgelöst, bei adaptiven Karten dagegen bleibt der Host-App die Entscheidung überlassen, wie „submit“ zu interpretieren ist.
- Wenn ein Ereignis ausgelöst werden MUSS, tippt der Benutzer auf die aufgerufene Aktion.
- Die
data
-Eigenschaft MUSS in der Rückrufnutzlast enthalten sein. - Bei
Action.Submit
MUSS ein Renderer alle Eingaben auf der Karte erfassen und die zugehörigen Werte abrufen.
1.x Renderer
: Die Eingaben werden aus allen Feldern gesammelt, unabhängig davon, wo in der Hierarchie sich das Eingabefeld befindet.2.x Renderer
: Die Eingaben werden aus Feldern gesammelt, die im übergeordneten Container oder als nebengeordnetes Element desAction.Submit
-Elements vorhanden sind.
Action.Execute (Details folgen später)
Action.Execute wurde in Version 1.4 eingeführt. Wir werden Anweisungen zur Implementierung von SDKs zu einem späteren Zeitpunkt zur Verfügung stellen. Bitte setzen Sie sich mit uns in Verbindung, wenn Sie Fragen zu diesem Thema haben.
selectAction
- Eine
selectAction
DARF NICHT als Berührungsziel gerendert werden, wenn dassupportedInteractivity
-Element der Hostkonfigurationfalse
ist. Image
,ColumnSet
undColumn
bieten eineselectAction
-Eigenschaft, die ausgeführt werden SOLLTE, wenn sie von einem Benutzer z. B. durch Tippen auf das Element aufgerufen wird.
Eingaben
- Ein Renderer DARF KEINE Eingaben rendern, wenn das
supportsInteractivity
-Element der HostConfigfalse
ist. - Eingaben SOLLTEN mit der höchstmöglichen Genauigkeit gerendert werden. Ein
Input.Date
-Element beispielsweise sollte dem Benutzer idealerweise eine Datumsauswahl bieten. Wenn dies jedoch in deinem UI-Stapel nicht möglich ist, MUSS der Renderer ein Standardtextfeld rendern. - Ein Renderer SOLLTE nach Möglichkeit
placeholderText
anzeigen. - Die Bindung von Eingabewerten MUSS ordnungsgemäß mit Escapezeichen versehen werden.
- Vor v1.3 muss ein Renderer KEINE Überprüfung der Eingabe implementieren. Benutzer von adaptiven Karten müssen die Überprüfung empfangener Daten auf ihrer Seite selbst planen.
- Eingabebezeichnungen und Überprüfung wurden in v1.3 des Schemas für adaptive Karten eingeführt. Beim Rendern der zugeordneten Bezeichnung, der Überprüfungshinweise und der Fehlermeldungen muss besonders sorgfältig vorgegangen werden.
Formatierungs-, Anpassungs- und Erweiterungs-APIs
Jedes SDK sollte ein gewisses Maß an Flexibilität zum Hosten von Apps bieten, um die Formatierung im Allgemeinen zu steuern und das Schema nach Bedarf zu erweitern.
Hostkonfiguration
- TODO: Wie sollten die Standardwerte lauten? Sollten diese überall freigegeben werden? Sollten wir eine gemeinsame hostConfig.json-Datei in den Binärdateien einbetten?
HostConfig
ist ein gemeinsam genutztes Konfigurationsobjekt, das angibt, wie ein Renderer für adaptive Karten eine Benutzeroberfläche generiert.
So können plattformunabhängige Eigenschaften für Renderer auf verschiedenen Plattformen und Geräten freigegeben werden. Zudem können Tools erstellt werden, die dir eine Vorstellung vom Aussehen und Verhalten einer Karte in einer bestimmten Umgebung vermitteln.
- Renderer MÜSSEN einen HostConfig-Parameter für Host-Apps verfügbar machen.
- Alle Elemente MÜSSEN entsprechend ihren jeweiligen HostConfig-Einstellungen formatiert werden.
Native Plattformformatierung
- Jeder Elementtyp SOLLTE eine native Plattformformatierung mit dem generierten Benutzeroberflächenelement anfügen. In HTML haben wir beispielsweise eine CSS-Klasse zu den Elementtypen hinzugefügt, und in XAML weisen wir einen bestimmten Stil zu.
Erweiterungen
- Ein Renderer MUSS es Host-Apps ermöglichen, standardmäßige Elementrenderer zu überschreiben. Beispiel: Ersetzen des Renderns von
TextBlock
durch eigene Logik. - Ein Renderer MUSS es Host-Apps ermöglichen, benutzerdefinierte Elementtypen zu registrieren. Beispiel: Hinzufügen von Unterstützung für ein benutzerdefiniertes
Rating
-Element. - Ein Renderer MUSS es Host-Apps ermöglichen, Unterstützung für ein Standardelement zu entfernen. Beispiel: Entfernen von
Action.Submit
, wenn die Unterstützung nicht gewünscht ist.
Ereignisse
- Ein Renderer SOLLTE ein Ereignis auslösen, wenn sich die Sichtbarkeit eines Elements geändert hat, sodass die Host-App die Karte an die richtige Position verschieben kann.