TextPatternRange.Move(TextUnit, Int32) Metod

Definition

Flyttar textområdet det angivna antalet textenheter.

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

Parametrar

unit
TextUnit

Textenhetens gräns.

count
Int32

Antalet textenheter som ska flyttas. Ett positivt värde flyttar textområdet framåt, ett negativt värde flyttar textområdet bakåt och 0 har ingen effekt.

Returer

Antalet enheter som faktiskt har flyttats. Detta kan vara mindre än det begärda antalet om någon av de nya textintervallslutpunkterna är större än eller mindre än DocumentRange slutpunkterna.

Exempel

/// -------------------------------------------------------------------
/// <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

Kommentarer

När det är nödvändigt att bläddra igenom innehållet i ett textintervall är en serie steg inblandade i bakgrunden för att metoden Move ska kunna köras korrekt.

  1. Textområdet normaliseras. Det innebär att textintervallet minimeras till ett degenererat intervall vid Start slutpunkten, vilket gör End slutpunkten överflödig. Det här steget är nödvändigt för att ta bort tvetydighet i situationer där ett textintervall sträcker sig över unit gränser, till exempel "{U}RL https://www.microsoft.com/ är inbäddad i text" där "{" och "}" är slutpunkterna för textintervallet.

  2. Det resulterande intervallet flyttas bakåt genom DocumentRange till början av den begärda unit gränsen.

  3. Intervallet flyttas framåt eller bakåt i DocumentRange med det begärda antalet unit gränser.

  4. Intervallet expanderas sedan från ett degenererat intervalltillstånd genom att slutpunkten End flyttas med en begärd unit gräns.

Intervalljusteringar efter Flytta och ExpanderaToEnclosingUnit-intervalljusteringar Exempel på hur ett textintervall justeras för Move() och ExpandToEnclosingUnit()

Textinnehållet (eller den inre texten) i en textcontainer och ett inbäddat objekt, till exempel en hyperlänk eller tabellcell, exponeras som en enda kontinuerlig textström i både kontrollvyn och innehållsvyn i UI Automation-trädet. objektgränser ignoreras. Om en UI Automation-klient hämtar texten i syfte att recitera, tolka eller analysera på något sätt, bör textintervallet kontrolleras för särskilda fall, till exempel en tabell med textinnehåll eller andra inbäddade objekt. Detta kan åstadkommas genom att anropa GetChildren för att hämta ett AutomationElement för varje inbäddat objekt och sedan anropa RangeFromChild för att hämta ett textintervall för varje element. Detta görs rekursivt tills allt textinnehåll har hämtats.

Textintervall som sträcker sig över inbäddade objekt. Exempel på en textström med inbäddade objekt och deras intervallintervall

Move respekterar både dold och synlig text. UI Automation-klienten kan kontrollera IsHiddenAttribute för textsynlighet.

Move defers till den näst största TextUnit som stöds om den angivna TextUnit inte stöds av kontrollen.

Ordningen, från den minsta enheten till den största, visas nedan.

Note

Texten ändras inte på något sätt eftersom textområdet bara sträcker sig över en annan del av texten.

Gäller för

Se även