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 control TextBlock que se define con un valor de Margin de 4.

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

En el siguiente ejemplo de código se muestra cómo utilizar el método GetOffset para recuperar el desplazamiento del control TextBlock. Los valores de desplazamiento se encuentran en el valor de Vector devuelto.

            ' 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)
// 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);

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

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

Obtener el desplazamiento relativo a un antecesor

En el ejemplo de marcado siguiente se muestra un objeto TextBlock anidado en dos 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>

En la ilustración siguiente se muestra el resultado del marcado.

Objeto TextBlock anidado dentro de dos objetos StackPanel

Valores de desplazamiento de objetos

En el siguiente ejemplo de código se muestra cómo utilizar el método TransformToAncestor para recuperar el desplazamiento del objeto TextBlock respecto al objeto Window contenedor. Los valores de desplazamiento se encuentran en el valor de GeneralTransform devuelto.

            ' 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))
// 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));

El desplazamiento tiene en cuenta los valores de la propiedad Margin de todos los objetos del objeto Window contendor. En este caso, el valor de X es 28 (16 + 8 + 4) y el valor de Y es 28.

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

Obtener el desplazamiento relativo a un descendiente

En el ejemplo de marcado siguiente se muestra un objeto TextBlock contenido en un objeto StackPanel.

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

En el siguiente ejemplo de código se muestra cómo utilizar el método TransformToDescendant para recuperar el desplazamiento del objeto StackPanel respecto a su objeto TextBlock secundario. Los valores de desplazamiento se encuentran en el valor de GeneralTransform devuelto.

            ' 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))
// 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));

El desplazamiento tiene en cuenta los valores de la propiedad Margin de todos los objetos. En este caso, el valor de X es -4 y el valor de Y es -4. Los valores de desplazamiento son valores negativos porque el objeto primario tiene un desplazamiento negativo respecto a su objeto secundario.

Vea también

Referencia

Visual

VisualTreeHelper

Conceptos

Información general sobre la representación de gráficos en WPF