Compartir a través de


Cómo: Obtener el desplazamiento de un objeto visual

En estos ejemplos se muestra cómo recuperar el valor de desplazamiento de un objeto visual relativo a su elemento primario, o a cualquier antecesor o descendiente.

Ejemplo

En el ejemplo de marcado siguiente, se muestra un TextBlock que se define con un Margin valor de 4.

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

En el ejemplo de código siguiente se muestra cómo usar el GetOffset método para recuperar el desplazamiento de TextBlock. Los valores de desplazamiento están contenidos en el valor Vector que se ha devuelto.

// 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);
' Return the offset vector for the TextBlock object.
Dim vector As Vector = VisualTreeHelper.GetOffset(myTextBlock)

' Convert the vector to a point value.
Dim currentPoint As New Point(vector.X, vector.Y)

El desplazamiento tiene en cuenta el valor Margin. En este caso, X es 4 y Y es 4.

El valor de desplazamiento devuelto es relativo al elemento primario de Visual. Si desea devolver un valor de desplazamiento que no es relativo al elemento primario de , Visualuse el TransformToAncestor método .

Obtener el desplazamiento relativo a un antecesor

En el ejemplo de marcado siguiente se muestra un TextBlock que está anidado dentro de dos StackPanel objetos.

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

En la ilustración siguiente se muestran los resultados del marcado.

Valores de desplazamiento de objetos
TextBlock anidado en dos StackPanels

En el ejemplo de código siguiente se muestra cómo usar el método TransformToAncestor para recuperar el desplazamiento del TextBlock relativo al contenedor Window. Los valores de desplazamiento están contenidos en el valor GeneralTransform que se ha devuelto.

// 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));
' Return the general transform for the specified visual object.
Dim generalTransform1 As GeneralTransform = myTextBlock.TransformToAncestor(Me)

' Retrieve the point value relative to the parent.
Dim currentPoint As Point = generalTransform1.Transform(New Point(0, 0))

El desplazamiento tiene en cuenta los Margin valores de todos los objetos de la colección que contiene Window. En este caso, X es 28 (16 + 8 + 4) y Y es 28.

El valor de desplazamiento devuelto es relativo al antecesor de Visual. Si desea devolver un valor de desplazamiento que sea relativo al descendiente de Visual, utilice el método TransformToDescendant.

Obtener el desplazamiento relativo a un descendiente

En el ejemplo de marcado siguiente se muestra un TextBlock que se encuentra dentro de un StackPanel objeto .

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

En el ejemplo de código siguiente se muestra cómo usar el TransformToDescendant método para recuperar el desplazamiento del StackPanel objeto relativo a su elemento secundario TextBlock. Los valores de desplazamiento están contenidos en el valor GeneralTransform que se ha devuelto.

// 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));
' Return the general transform for the specified visual object.
Dim generalTransform1 As GeneralTransform = myStackPanel.TransformToDescendant(myTextBlock)

' Retrieve the point value relative to the child.
Dim currentPoint As Point = generalTransform1.Transform(New Point(0, 0))

El desplazamiento tiene en cuenta los Margin valores de todos los objetos. En este caso, X es -4 y Y es -4. Los valores de desplazamiento son valores negativos, ya que el objeto primario se desplaza negativamente en relación con su objeto secundario.

Consulte también