So macht die Benutzeroberflächenautomatisierung eingebettete Objekte verfügbar
In diesem Thema wird beschrieben, wie Microsoft-Benutzeroberflächenautomatisierung die Text- und TextRange-Steuerelementmuster verwendet, um eingebettete Objekte (untergeordnete Elemente/Nachfolgerelemente) in einem Textdokument oder Container verfügbar zu machen.
Für die Benutzeroberflächenautomatisierung ist ein eingebettetes Objekt ein beliebiges Element, das Nicht-Textgrenzen aufweist, z. B. ein Bild, ein Link, eine Tabelle oder ein Dokumenttyp (Microsoft Excel-Tabelle, Microsoft Windows Media-Datei usw.).
Hinweis
Dies unterscheidet sich von der OLE-Definition des Component Object Model (COM) (siehe Eingebettete Objekte), bei der ein Element in einer Anwendung erstellt und in eine andere Anwendung eingebettet oder verknüpft wird. Ob das Objekt in seiner ursprünglichen Anwendung bearbeitet werden kann, ist im Kontext von Benutzeroberflächenautomatisierung nicht relevant.
Eingebettete Objekte und die Benutzeroberflächenautomatisierungs-Struktur
Eingebettete Objekte werden als einzelne Elemente in der Steuerelementansicht der Struktur der Benutzeroberflächenautomatisierung behandelt. Sie werden als untergeordnete Elemente des Textcontainers verfügbar gemacht, sodass über dasselbe Objektmodell wie bei anderen Steuerelementen in der Benutzeroberflächenautomatisierung auf diese zugegriffen werden kann.
In der folgenden Tabelle sind Beispiele für Container- und Nicht-Containerelemente aufgeführt.
Containerelemente
Nicht-Containerelemente
- Calendar
- Kombinationsfeld
- DataGrid
- Dokument
- Bearbeiten
- Group
- Header
- HeaderItem
- Liste
- Menü
- MenuBar
- Bereich
- SplitButton
- Tab
- Tabelle
- Symbolleiste
- Struktur
- TreeItem
- Window
- Verknüpfung
- CheckBoxes
- Taste
Die folgende Abbildung zeigt einen Textcontainer (Dokument) mit einer eingebetteten Tabelle und einem eingebetteten Bild.
Die Inhaltsansicht der Benutzeroberflächenautomatisierung des vorherigen Dokuments wird im folgenden Diagramm dargestellt.
„Kompatible“ und „nicht kompatible“ eingebettete Objekte
Einige Anbieter von Benutzeroberflächenautomatisierung verwenden denselben Textspeicher für jedes TextPattern-Objekt, das sie enthalten. Objekte, die von demselben Textspeicher wie ihr Container unterstützt werden, werden als „kompatible“ eingebettete Objekte bezeichnet. Bei diesen Objekten kann es sich um TextPattern-Objekte selbst handeln, und in diesem Fall sind ihre Textbereiche mit Textbereichen vergleichbar, die aus ihrem Container abgerufen werden. Dies ermöglicht es den Anbietern, Clientinformationen zu den einzelnen TextPattern-Objekten verfügbar zu machen, als wären sie ein großer Textanbieter.
Anbieter können jedoch unterschiedliche Textspeicher für verschiedene TextPattern-Objekte verwenden, die in einem TextPattern-Container eingebettet sind. Objekte, die nicht vom Textspeicher des Containers unterstützt werden, werden als „nicht kompatible“ eingebettete Objekte bezeichnet. Diese Typen von eingebetteten Objekten können TextPattern-basierte Objekte sein.
In der folgenden Tabelle sind einige Beispiele für kompatible und nicht kompatible eingebettete Objekte aufgeführt.
Objekte | Kompatible eingebettete Objekte | Nicht kompatible eingebettete Objekte |
---|---|---|
Eingebettete Nicht-TextPattern-Objekte | Schaltfläche in Microsoft Edge Datentabelle in Microsoft Edge |
Schaltfläche in „RichTextBlock“ im XAML-Framework von Microsoft Bilder mit Alternativtext in Microsoft Edge „ListView“ mit „ListItems“ in „RichTextBlock“ im XAML-Framework von Microsoft |
Eingebettete TextPattern-Objekte | Eingabesteuerelement vom Typ „Text“ in Microsoft Edge Tabelle in einem Word-Dokument |
TextBox-Element in einem Microsoft Word-Dokument |
Verfügbarmachen von eingebetteten Objekten
Die Steuerelementmuster Text and TextRange machen Methoden und Eigenschaften verfügbar, die das Navigieren und Abfragen von eingebetteten Objekten erleichtern.
Der Textinhalt (oder innere Text) eines Textcontainers und ein eingebettetes Objekt, z. B. ein Link oder eine Tabellenzelle, werden in der Steuerelementansicht und der Inhaltsansicht der Struktur für die Benutzeroberflächenautomatisierung als einzelner, kontinuierlicher Textstream verfügbar gemacht. Objektgrenzen werden dabei ignoriert. Wenn ein Benutzeroberflächenautomatisierungs-Client den Text abruft, um ihn zu lesen, zu interpretieren oder zu analysieren, muss der Textbereich auf bestimmte Fälle überprüft werden, z. B. auf Tabellen mit Textinhalt oder andere eingebettete Objekte. Rufen Sie IUIAutomationTextRange::GetChildren auf, um eine IUIAutomationElement--Schnittstelle für jedes eingebettete Objekt abzurufen, und rufen Sie dann IUIAutomationTextPattern::RangeFromChild auf, um einen Textbereich für jedes Element abzurufen. Dies wird rekursiv ausgeführt, bis der gesamte Textinhalt abgerufen wurde.
Hinweis
Ein degenerierter (oder reduzierter) Bereich ist die Stelle, an welcher der Startendpunkt und der Endpunkt identisch sind. Degenerierte Bereiche werden häufig verwendet, um die Textcursorposition über die ITextProvider-Methoden GetSelection und GetCaretRange anzugeben.
Das folgende Diagramm zeigt einen Textdatenstrom mit eingebetteten Objekten und deren Bereich.
Eingebettete Objekte und TextUnit
Ein ITextProvider-Objekt kann durch ein angegebenes TextUnit-Element durchlaufen werden. Anbieter, die eingebettete Objekte enthalten, können auf die gleiche Weise durchlaufen werden, aber eingebettete Objekte wirken sich auf das Durchlaufen aus. Hier sind einige Aspekte, die es zu beachten gilt:
- Jedes nicht kompatible eingebettete Objekt wird durch das Ersatzzeichen U+FFFC im Textspeicher des TextPattern-Elements des Containerelements dargestellt. Es gilt auch als Zeicheneinheit und Worteinheit.
- Kompatible eingebettete Objekte können aus mehreren Zeichen und Wörtern bestehen.
- Das umschließende Element ist das unterste Element, das sich über den gesamten Textbereich erstreckt.
- Untergeordnete Elemente eines Bereichs sind auch untergeordnete Elemente eines Containerelements, das teilweise oder vollständig innerhalb des Bereichs eingeschlossen ist.
- Im Idealfall (insbesondere bei Containerelementen wie Tabelle) geht eine Wortgrenze nicht über die Objektgrenze hinaus. Im folgenden Beispiel enthält die Worteinheit „Bar“ keine Textposition außerhalb des
</td>
Tags (<br \>
ist nicht Teil des Worts „Bar“).
<table style="width:100%">
<tr>
<th>Name</th>
<th>Notes</th>
</tr>
<tr>
<td>Eve Jackson</td>
<td>Foo Bar</td>
</tr>
</table>
<br/>
- Im Allgemeinen wird
<br \>
als einzelnes Wort behandelt, sodass es nicht über eine Zeilengrenze hinausgeht. - Eine Ausnahme von der vorherigen Regel besteht darin, dass eine Word-Texteinheit vollständige Objekte in sich selbst enthält. Beispiel: Enthält
<p>Hello <a href="#">link</a> here.</p>
, das Inlinecontainer umfasst, enthält die Wörter „Hello“, „link“ und „here“. Dabei weist „link“ ein TextPattern-Objekt als umschließendes Element und ein Linkobjekt als untergeordnetes Objekt auf. - Im Fall von Zeicheneinheiten ist das Objekt das umschließende Element (solche Texteinheiten dürfen keine untergeordneten Elemente haben).
- Anmerkungsobjekte dürfen nicht als eingebettetes Objekt dargestellt werden. Ein Beispiel dafür ist das Vorhandensein von Bezeichnern für andere Autoren in einem gemeinsam erstellten Dokument.
- Eingebettete Objekte nehmen mindestens eine Cursorposition ein, Anmerkungen sind nur Metadaten.
- Jede Objektgrenze (Start und Ende) wird durch einen Formatwechsel im TextPattern-Dokumentbereich dargestellt.
- Für HTML führt jedes HTML-Tag nicht unbedingt zu einem Benutzeroberflächenautomatisierungs-Objekt. Beispielsweise müssen Inhalte innerhalb von -Hervorhebungstags nicht als Element dargestellt werden, sondern als Textdatenstrom, in dem „UIA_IsItalicAttributeId“ „TRUE“ zurückgibt.
- Der Endpunkt „Start“ ist einschließend und ist der bevorzugte Endpunkt, während der Endpunkt „Ende“ ausschließend ist. Dies ist nützlich, wenn der Bereich degeneriert ist und die Endpunkte „Start“ und „Ende“ zur selben Position für diesen Bereich gehören.
Vergleich eingebetteter Objekte
Geschachtelte TextPattern-Objekte, die sich in einer ähnlichen untergeordneten Beziehung befinden und denselben Sicherungstextspeicher gemeinsam verwenden, werden als vergleichbar bezeichnet. In diesem Fall können Bereiche von einem der TextPattern-Objekte mithilfe von ITextRangeProvider::Compare und ITextRangeProvider::CompareEndpoints verglichen werden. Beide führen zu einem gültigen numerischen Wert, der ihre relative Position angibt.
Ein Nicht-TextPattern-Objekt, das in ein TextPattern-Objekt eingebettet ist, ist mit dem TextPattern-Objekt vergleichbar, wenn das Objekt über einen gültigen Bereich im TextPattern-Objekt (ITextProvider::RangeFromChild) verfügt und der Inhalt hinter dem Textbereich nicht leer ist und kein Ersatzzeichen ist.
Eingebettete TextPattern-Objekte und „TextUnit“ des Dokuments
Bei eingebetteten TextPattern-Objekten erkennt die Dokumenteinheit nur den Inhalt, der in diesem Element enthalten ist.
TextPattern-Elementhierarchie in Word
- Das Dokumentelement implementiert TextPattern, und Document gibt den gesamten Word-Dokumentbereich zurück.
- Einzelne Seiten des Dokuments implementieren TextPattern, und Document gibt den Inhalt dieser einzelnen Seiten zurück (auch wenn die Seiten denselben Textspeicher mit dem gesamten TextPattern des Dokuments teilen).
Webseiten- und Texteingabesteuerelemente in Edge
- Das Hauptwebseitenelement implementiert TextPattern und macht den gesamten Webseiteninhalt verfügbar.
- Einzelne Texteingabesteuerelemente unterstützen TextPattern, wobei ein Dokumentbereich den Text darstellt, der in jedem Eingabefeld enthalten ist (obwohl sie denselben Textspeicher mit der gesamten Webseite teilen).
Häufige Szenarien
In diesem Abschnitt werden Beispiele für allgemeine Szenarien vorgestellt, die eingebettete Objekte umfassen: Links, Bilder und Tabellen. In den folgenden Beispielen stellt die linke geschweifte Klammer ({) den Endpunkt „Start“ des Textbereichs dar, und die rechte geschweifte Klammer (}) stellt den Endpunkt „Ende“ dar.
HyperLink-Beispiel 1: Ein Textbereich, der einen eingebetteten Textlink enthält
Der folgende Textbereich enthält einen eingebetteten Textlink.
{Die URL https://www.microsoft.com ist in Text eingebettet}.
Das Aufrufen der Methoden IUIAutomationTextRange::GetText, GetEnclosingElement, GetChildren und IUIAutomationTextPattern::RangeFromChild führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationTextRange::GetText | Gibt die Zeichenfolge „Die URL https://www.microsoft.com ist in Text eingebettet“ zurück. |
IUIAutomationTextRange::GetEnclosingElement | Gibt das innerste Benutzeroberflächenautomatisierungs-Element zurück, das den Textbereich umschließt, in diesem Fall das Automatisierungselement, das den Textanbieter selbst darstellt. |
IUIAutomationTextRange::GetChildren | Gibt ein Benutzeroberflächenautomatisierungs-Element zurück, welches das Hyperlink-Steuerelement darstellt. |
IUIAutomationTextPattern::RangeFromChild, wobei das Benutzeroberflächenautomatisierungs-Element von der vorherigenIUIAutomationTextRange::GetChildren-Methode zurückgegeben wurde. | Gibt den Bereich zurück, der „https://www.microsoft.com"“ darstellt. |
HyperLink-Beispiel 2: Ein Textbereich, der einen eingebetteten Textlink nur teilweise enthält
Der folgende Textbereich erstreckt sich teilweise über einen eingebetteten Textlink.
Die URL https://{www} ist in Text eingebettet.
Das Aufrufen der Methoden IUIAutomationTextRange::GetText, GetEnclosingElement und GetChildren führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationTextRange::GetText | Gibt die Zeichenfolge „www“ zurück. |
IUIAutomationTextRange::GetEnclosingElement | Gibt das innerste Benutzeroberflächenautomatisierungs-Element zurück, das den Textbereich umschließt; in diesem Fall das Hyperlink-Steuerelement. |
IUIAutomationTextRange::GetChildren | Gibt NULL zurück, da der Textbereich nicht die gesamte URL-Zeichenfolge umfasst. |
HyperLink-Beispiel 3: Ein Textbereich, der sich teilweise über den Inhalt eines Textcontainers erstreckt
Der folgende Textbereich erstreckt sich teilweise über den Inhalt eines Textcontainers. Der Textcontainer enthält einen eingebetteten Textlink, der nicht im Textbereich enthalten ist.
{Die URL} https://www.microsoft.com ist in Text eingebettet.
Das Aufrufen der Methoden IUIAutomationTextRange::GetText, GetEnclosingElement und Move führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationTextRange::GetText | Gibt die Zeichenfolge „Die URL“ zurück. |
IUIAutomationTextRange::GetEnclosingElement | Gibt das innerste Benutzeroberflächenautomatisierungs-Element zurück, das den Textbereich umschließt, in diesem Fall das Element, das den Textanbieter selbst darstellt. |
IUIAutomationTextRange::Move | Verschiebt die Textbereichsspanne nach „https://“, da der Text des Links aus einzelnen Wörtern besteht. In diesem Fall wird der Link nicht als einzelnes Objekt behandelt. Die URL {http} ist in Text eingebettet. |
Bildbeispiel 1: Ein Textbereich, der ein eingebettetes Bild enthält
Der folgende Textbereich enthält ein eingebettetes Bild eines Shuttles.
{Das Bild ist in Text eingebettet}.
Das Aufrufen der Methoden IUIAutomationTextRange::GetText, GetEnclosingElement, GetChildren und IUIAutomationTextPattern::RangeFromChild führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationTextRange::GetText | Gibt die Zeichenfolge „Das Bild ist in Text eingebettet“ zurück. Ein dem Bild zugeordneter Alternativtext (ALT) wird nicht in den Textdatenstrom aufgenommen. |
IUIAutomationTextRange::GetEnclosingElement | Gibt das innerste Benutzeroberflächenautomatisierungs-Element zurück, das den Textbereich umschließt, in diesem Fall das Element, das den Textanbieter selbst darstellt. |
IUIAutomationTextRange::GetChildren | Gibt ein Benutzeroberflächenautomatisierungs-Element zurück, welches das Bildsteuerelement darstellt. |
IUIAutomationTextPattern::RangeFromChild, wobei das Benutzeroberflächenautomatisierungs-Element von der vorherigenIUIAutomationTextRange::GetChildren-Methode zurückgegeben wurde. | Gibt den degenerierten Bereich zurück. |
Bildbeispiel 2: Ein Textbereich, der sich teilweise über den Inhalt eines Textcontainers erstreckt
Der folgende Textbereich erstreckt sich teilweise über den Inhalt eines Textcontainers. Der Textcontainer enthält ein eingebettetes Bild, das nicht im Textbereich enthalten ist.
{Das Bild} ist in Text eingebettet.
Das Aufrufen der Methoden IUIAutomationTextRange::GetText, GetEnclosingElement und Move führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationTextRange::GetText | Gibt die Zeichenfolge „Das Bild“ zurück. |
IUIAutomationTextRange::GetEnclosingElement | Gibt das innerste Benutzeroberflächenautomatisierungs-Element zurück, das den Textbereich umschließt, in diesem Fall das Element, das den Textanbieter selbst darstellt. |
IUIAutomationTextRange::Move mit Parametern von (TextUnit_Word, 2). | Verschiebt den Textbereichsabschnitt nach „ist“. Da nur textbasierte eingebettete Objekte als Teil des Textdatenstroms betrachtet werden, hat das Bild in diesem Beispiel keine Auswirkungen auf IUIAutomationTextRange::Move oder dessen Rückgabewert (in diesem Fall 2). |
Tabelle
Tabellenbeispiel 1: Ruft den Textcontainer aus dem Inhalt einer Zelle ab
In der folgenden Tabelle wird der Textcontainer aus dem Inhalt einer Zelle abgerufen.
Zelle mit Bild | Zelle mit Text |
---|---|
X | |
Y | |
Z |
Das Aufrufen der Methoden IUIAutomationGridPattern::GetItem, IUIAutomationTextPattern::RangeFromChild und IUIAutomationTextRange::GetEnclosingElement führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationGridPattern::GetItem mit Parametern (0, 0). | Gibt das Benutzeroberflächenautomatisierungs-Element zurück, das den Inhalt der Tabellenzelle darstellt; in diesem Fall ist das Element ein Textsteuerelement. |
iuiautomationtextpattern::rangefromchild | Gibt den Bereich des Bilds zurück. |
GetEnclosingElement für das Objekt, das von der vorherigen IUIAutomationTextPattern::RangeFromChild-Methode zurückgegeben wird. | Gibt das Benutzeroberflächenautomatisierungs-Element zurück, das die Tabellenzelle darstellt. In diesem Fall ist das Element ein Textsteuerelement, welches das TableItem-Steuerelementmuster unterstützt. |
IUIAutomationTextRange::GetEnclosingElement für das Objekt, das von der vorherigen GetEnclosingElement-Methode zurückgegeben wird. | Gibt das Benutzeroberflächenautomatisierungs-Element zurück, das die Tabelle darstellt. |
IUIAutomationTextRange::GetEnclosingElement für das Objekt, das von der vorherigen GetEnclosingElement-Methode zurückgegeben wird. | Gibt das Benutzeroberflächenautomatisierungs-Element zurück, das den Textanbieter selbst darstellt. |
Tabellenbeispiel 2: Ruft den Textinhalt einer Zelle ab
Die Tabelle im vorherigen Beispiel ruft den Textinhalt einer Zelle ab.
Das Aufrufen der Methoden IUIAutomationGridPattern::GetItem und IUIAutomationTextPattern::RangeFromChild führt zu den in der folgenden Tabelle beschriebenen Verhaltensweisen.
Aufgerufene Methode | Ergebnis |
---|---|
IUIAutomationGridPattern::GetItem mit Parametern (1,1). | Gibt das Benutzeroberflächenautomatisierungs-Element zurück, das den Inhalt der Tabellenzelle darstellt. In diesem Fall ist das Element ein Textsteuerelement. |
IUIAutomationTextPattern::RangeFromChild, wobei das Benutzeroberflächenautomatisierungs-Element das Objekt ist, das von der vorherigen IUIAutomationGridPattern::GetItem-Methode zurückgegeben wird. | Gibt „Y“ zurück. |
Wenn ein Dokument nach TextUnit_Line durchlaufen wird und der Textbereich in eine eingebettete Tabelle eintritt, muss jede Textzeile in einer Zelle als eine Zeile behandelt werden.