TextPatternRange.Move(TextUnit, Int32) Methode

Definitie

Hiermee verplaatst u het tekstbereik het opgegeven aantal teksteenheden.

public:
 int Move(System::Windows::Automation::Text::TextUnit unit, int count);
public int Move(System.Windows.Automation.Text.TextUnit unit, int count);
member this.Move : System.Windows.Automation.Text.TextUnit * int -> int
Public Function Move (unit As TextUnit, count As Integer) As Integer

Parameters

unit
TextUnit

De grens van de teksteenheid.

count
Int32

Het aantal te verplaatsen teksteenheden. Een positieve waarde verplaatst het tekstbereik vooruit, een negatieve waarde verplaatst het tekstbereik naar achteren en 0 heeft geen effect.

Retouren

Het aantal eenheden dat daadwerkelijk is verplaatst. Dit kan kleiner zijn dan het aangevraagde aantal als een van de nieuwe eindpunten van het tekstbereik groter is dan of kleiner is dan de DocumentRange eindpunten.

Voorbeelden

/// -------------------------------------------------------------------
/// <summary>
/// Starts the target application and returns the AutomationElement 
/// obtained from the targets window handle.
/// </summary>
/// <param name="exe">
/// The target application.
/// </param>
/// <param name="filename">
/// The text file to be opened in the target application
/// </param>
/// <returns>
/// An AutomationElement representing the target application.
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement StartTarget(string exe, string filename)
{
    // Start text editor and load with a text file.
    Process p = Process.Start(exe, filename);

    // targetApp --> the root AutomationElement.
    AutomationElement targetApp =
        AutomationElement.FromHandle(p.MainWindowHandle);

    return targetApp;
}
''' -------------------------------------------------------------------
''' <summary>
''' Starts the target application and returns the AutomationElement 
''' obtained from the targets window handle.
''' </summary>
''' <param name="exe">
''' The target application.
''' </param>
''' <param name="filename">
''' The text file to be opened in the target application
''' </param>
''' <returns>
''' An AutomationElement representing the target application.
''' </returns>
''' -------------------------------------------------------------------
Private Function StartTarget( _
ByVal exe As String, ByVal filename As String) As AutomationElement
    ' Start text editor and load with a text file.
    Dim p As Process = Process.Start(exe, filename)

    ' targetApp --> the root AutomationElement.
    Dim targetApp As AutomationElement
    targetApp = AutomationElement.FromHandle(p.MainWindowHandle)

    Return targetApp
End Function
/// -------------------------------------------------------------------
/// <summary>
/// Obtain the text control of interest from the target application.
/// </summary>
/// <param name="targetApp">
/// The target application.
/// </param>
/// <returns>
/// An AutomationElement that represents a text provider..
/// </returns>
/// -------------------------------------------------------------------
private AutomationElement GetTextElement(AutomationElement targetApp)
{
    // The control type we're looking for; in this case 'Document'
    PropertyCondition cond1 =
        new PropertyCondition(
        AutomationElement.ControlTypeProperty,
        ControlType.Document);

    // The control pattern of interest; in this case 'TextPattern'.
    PropertyCondition cond2 = 
        new PropertyCondition(
        AutomationElement.IsTextPatternAvailableProperty, 
        true);

    AndCondition textCondition = new AndCondition(cond1, cond2);

    AutomationElement targetTextElement =
        targetApp.FindFirst(TreeScope.Descendants, textCondition);

    // If targetText is null then a suitable text control was not found.
    return targetTextElement;
}
''' -------------------------------------------------------------------
''' <summary>
''' Obtain the text control of interest from the target application.
''' </summary>
''' <param name="targetApp">
''' The target application.
''' </param>
''' <returns>
''' An AutomationElement. representing a text control.
''' </returns>
''' -------------------------------------------------------------------
Private Function GetTextElement(ByVal targetApp As AutomationElement) As AutomationElement
    ' The control type we're looking for; in this case 'Document'
    Dim cond1 As PropertyCondition = _
        New PropertyCondition( _
        AutomationElement.ControlTypeProperty, _
        ControlType.Document)

    ' The control pattern of interest; in this case 'TextPattern'.
    Dim cond2 As PropertyCondition = _
        New PropertyCondition( _
        AutomationElement.IsTextPatternAvailableProperty, _
        True)

    Dim textCondition As AndCondition = New AndCondition(cond1, cond2)

    Dim targetTextElement As AutomationElement = _
        targetApp.FindFirst(TreeScope.Descendants, textCondition)

    ' If targetText is null then a suitable text control was not found.
    Return targetTextElement
End Function
/// -------------------------------------------------------------------
/// <summary>
/// Moves a text range a specified number of text units. The text range 
/// is the current selection.
/// </summary>
/// <param name="targetTextElement">
/// The AutomationElment that represents a text control.
/// </param>
/// <param name="textUnit">
/// The text unit value.
/// </param>
/// <param name="units">
/// The number of text units to move.
/// </param>
/// <param name="direction">
/// Direction to move the text range. Valid values are -1, 0, 1.
/// </param>
/// <returns>
/// The number of text units actually moved. This can be less than the 
/// number requested if either of the new text range endpoints is 
/// greater than or less than the DocumentRange endpoints. 
/// </returns>
/// <remarks>
/// Moving the text range does not modify the text source in any way. 
/// Only the text range starting and ending endpoints are modified.
/// </remarks>
/// -------------------------------------------------------------------
private Int32 MoveSelection(
    AutomationElement targetTextElement, 
    TextUnit textUnit,
    int units,
    int direction)
{
    TextPattern textPattern =
        targetTextElement.GetCurrentPattern(TextPattern.Pattern) 
        as TextPattern;

    if (textPattern == null)
    {
        // Target control doesn't support TextPattern.
        return -1;
    }

    TextPatternRange[] currentSelection = textPattern.GetSelection();

    if (currentSelection.Length > 1)
    {
        // For this example, we cannot move more than one text range.
        return -1;
    }

    return currentSelection[0].Move(textUnit, Math.Sign(direction) * units);
}
''' -------------------------------------------------------------------
''' <summary>
''' Moves a text range a specified number of text units.
''' </summary>
''' <param name="targetTextElement">
''' The AutomationElement that represents a text control.
''' </param>
''' <param name="textUnit">
''' The text unit value.
''' </param>
''' <param name="units">
''' The number of text units to move.
''' </param>
''' <param name="direction">
''' Direction to move the text range. Valid values are -1, 0, 1.
''' </param>
''' <returns>
''' The number of text units actually moved. This can be less than the 
''' number requested if either of the new text range endpoints is 
''' greater than or less than the DocumentRange endpoints. 
''' </returns>
''' <remarks>
''' Moving the text range does not modify the text source in any way. 
''' Only the text range starting and ending endpoints are modified.
''' </remarks>
''' -------------------------------------------------------------------
Private Function MoveSelection( _
    ByVal targetTextElement As AutomationElement, _
    ByVal textUnit As TextUnit, _
    ByVal units As Integer, _
    ByVal direction As Integer) As Integer

    Dim textPattern As TextPattern = _
    DirectCast( _
    targetTextElement.GetCurrentPattern(textPattern.Pattern), _
    TextPattern)

    If (textPattern Is Nothing) Then
        ' Target control doesn't support TextPattern.
        Return -1
    End If

    Dim currentSelection As TextPatternRange() = _
    textPattern.GetSelection()

    If (currentSelection.Length > 1) Then
        ' For this example, we cannot move more than one text range.
        Return -1
    End If

    Return currentSelection(0).Move(textUnit, Math.Sign(direction) * units)
End Function

Opmerkingen

Wanneer het nodig is om de inhoud van een tekstbereik te doorlopen, wordt achter de schermen een reeks stappen uitgevoerd om de Move methode succesvol uit te voeren.

  1. Het tekstbereik wordt genormaliseerd; Dat wil gezegd: het tekstbereik wordt samengevouwen tot een degenererend bereik op het Start eindpunt, waardoor het End eindpunt overbodig wordt. Deze stap is nodig om dubbelzinnigheid te verwijderen in situaties waarin een tekstbereik grenzen omvat unit , bijvoorbeeld {De U}RL https://www.microsoft.com/ is ingesloten in tekst, waarbij {en }de eindpunten van het tekstbereik zijn.

  2. Het resulterende bereik wordt verplaatst achterwaarts in de DocumentRange tot het begin van de aangevraagde unit grens.

  3. Het bereik wordt naar voren of naar achteren verplaatst in DocumentRange met het aangevraagde aantal unit grenzen.

  4. Het bereik wordt vervolgens uitgebreid vanuit een gedegenereerde toestand door het End eindpunt met één aangevraagde unit grens te verplaatsen.

Bereikaanpassingen door Move & ExpandToEnclosingUnit Voorbeelden van hoe een tekstbereik wordt aangepast voor Move() en ExpandToEnclosingUnit()

De tekstuele inhoud (of binnenste tekst) van een tekstcontainer en een ingesloten object, zoals een hyperlink of tabelcel, wordt weergegeven als één doorlopende tekststroom in zowel de besturingsweergave als de inhoudsweergave van de UI Automation-structuur; objectgrenzen worden genegeerd. Als een UI Automation-client de tekst ophaalt om tekst op een bepaalde manier te reciteren, interpreteren of analyseren, moet het tekstbereik worden gecontroleerd op speciale gevallen, zoals een tabel met tekstuele inhoud of andere ingesloten objecten. Dit kan worden bereikt door aan te roepen GetChildren om een AutomationElement voor elk ingesloten object te verkrijgen en vervolgens aan te roepen RangeFromChild om een tekstbereik voor elk element te verkrijgen. Dit gebeurt recursief totdat alle tekstuele inhoud is opgehaald.

Tekstbereiken die zijn verspreid door ingesloten objecten. Voorbeeld van een tekststroom met ingesloten objecten en de bijbehorende bereikbereiken

Move respecteert zowel verborgen als zichtbare tekst. De UI Automation-client kan de IsHiddenAttribute controleren op tekstzichtbaarheid.

Move wordt uitgesteld tot het eerstvolgende grootste TextUnit ondersteund als de opgegeven TextUnit niet wordt ondersteund door het besturingselement.

De volgorde, van kleinste eenheid tot grootste, wordt hieronder vermeld.

Note

De tekst wordt op geen enkele manier gewijzigd omdat het tekstbereik slechts een ander deel van de tekst omvat.

Van toepassing op

Zie ook