Partilhar via


Como: Get the Offset of a Visual

Esses exemplos mostram como recuperar o valor de deslocamento de um objeto visual que é relativo a seu pai, ou qualquer predecessor ou descendente.

Exemplo

O exemplo a seguir de marcação mostra um TextBlock que é definido com valor de Margin como 4.

<TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" />

O exemplo de código a seguir mostra como usar o método GetOffset para recuperar o deslocamento de TextBlock. Os valores de deslocamento estão contidos no valor retornado por Vector.

// Return the offset vector for the TextBlock object.
Vector vector = VisualTreeHelper.GetOffset(myTextBlock);

// Convert the vector to a point value.
Point currentPoint = new Point(vector.X, vector.Y);

O deslocamento leva em consideração o valor de Margin. Nesse caso, X é 4, e Y é 4.

O valor de deslocamento retornado é relativo ao pai do Visual. Se você quiser retornar um valor de deslocamento que não é relativo ao pai de um Visual, use o método TransformToAncestor.

Obtendo o Deslocamento Relativo a um Ancestral

O exemplo a seguir de marcação mostra um TextBlock que está aninhado em dois objetos StackPanel.

<Window xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" >
  <StackPanel Margin="16">
    <StackPanel Margin="8">
      <TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" />
    </StackPanel>
  </StackPanel>
</Window>

A ilustração a seguir mostra os resultados da marcação.

TextBlock aninhados em dois StackPanels

Valores de deslocamento de objetos

O exemplo de código a seguir mostra como usar o método TransformToAncestor para recuperar o deslocamento de TextBlock em relação ao Window contido. Os valores de deslocamento estão contidos no valor retornado por GeneralTransform.

// Return the general transform for the specified visual object.
GeneralTransform generalTransform1 = myTextBlock.TransformToAncestor(this);

// Retrieve the point value relative to the parent.
Point currentPoint = generalTransform1.Transform(new Point(0, 0));

O deslocamento leva em consideração os valores de Margin para todos os objetos dentro do Window contido. Nesse caso, X é 28 (16 + 8 + 4), e Y é 28.

O valor de deslocamento retornado é relativo ao ancestral do Visual. Se você quiser retornar um valor de deslocamento que não é relativo ao ancestral de um Visual, use o método TransformToDescendant.

Obtendo o Deslocamento Relativo a um Descendente

O exemplo a seguir de marcação mostra um TextBlock que está contido no objeto StackPanel.

<StackPanel Name="myStackPanel" Margin="8">
  <TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" />
</StackPanel>

O exemplo de código a seguir mostra como usar o método TransformToDescendant para recuperar o deslocamento de StackPanel em relação aos TextBlock de seus filhos. Os valores de deslocamento estão contidos no valor retornado por GeneralTransform.

// Return the general transform for the specified visual object.
GeneralTransform generalTransform1 = myStackPanel.TransformToDescendant(myTextBlock);

// Retrieve the point value relative to the child.
Point currentPoint = generalTransform1.Transform(new Point(0, 0));

O deslocamento leva em conta os valores de Margin para todos os objetos. Nesse caso, X é -4, e Y é -4. Os valores de deslocamento são valores negativos, desde que o objeto pai negativamente deslocado em relação ao seu objeto filho.

Consulte também

Conceitos

Visão Geral sobre Renderização de Gráficos do Windows Presentation Foundation

Referência

Visual

VisualTreeHelper