Freigeben über


Gewusst wie: Abrufen des Offsets eines visuellen Objekts

Diese Beispiele zeigen, wie Sie den Offsetwert eines visuellen Objekts abrufen, das relativ zu seinem übergeordneten Element oder einem beliebigen Vorgänger oder Nachfolger angeordnet ist.

Beispiel

Das folgende Markupbeispiel zeigt einen TextBlock, für den unter Margin der Wert 4 definiert ist.

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

Im folgenden Codebeispiel wird die Verwendung der GetOffset-Methode zum Abrufen des Offsets für den TextBlock veranschaulicht. Die Offsetwerte sind im zurückgegebenen Vector-Wert enthalten.

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

Für den Offset wird der Margin-Wert berücksichtigt. In diesem Fall hat X den Wert 4 und Y ebenfalls den Wert 4.

Der zurückgegebene Offsetwert verhält sich relativ zum übergeordneten Element von Visual. Wenn Sie einen Offsetwert zurückgeben möchten, der sich nicht relativ zum übergeordneten Element eines Visual-Elements verhält, verwenden Sie die TransformToAncestor-Methode.

Abrufen des Offsetwerts relativ zu einem Vorgänger

Das folgende Markupbeispiel zeigt einen TextBlock, der in zwei StackPanel-Objekten geschachtelt ist.

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

In der folgenden Abbildung sind die Ergebnisse des Markups dargestellt.

TextBlock in zwei StackPanels geschachtelt

Versatzwerte für Objekte

Das folgende Codebeispiel zeigt, wie Sie die TransformToAncestor-Methode zum Abrufen des Offsetwerts von TextBlock relativ zum enthaltenden Window-Element verwenden. Die Offsetwerte sind im zurückgegebenen GeneralTransform-Wert enthalten.

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

Beim Offset werden die Margin-Werte für alle Objekte innerhalb des enthaltenden Window-Elements berücksichtigt. In diesem Fall ist X 28 (16 + 8 + 4) und Y ebenfalls 28.

Der zurückgegebene Offsetwert verhält sich relativ zum Vorgänger von Visual. Wenn Sie einen Offsetwert zurückgeben möchten, der sich relativ zum Nachfolger eines Visual-Elements verhält, verwenden Sie die TransformToDescendant-Methode.

Abrufen des Offsetwerts relativ zu einem Nachfolger

Das folgende Markupbeispiel zeigt einen TextBlock, der in einem StackPanel-Objekt enthalten ist.

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

Im folgenden Codebeispiel wird die Verwendung der TransformToDescendant-Methode zum Abrufen des Offsets für den StackPanel relativ zu dessen untergeordnetem TextBlock veranschaulicht. Die Offsetwerte sind im zurückgegebenen GeneralTransform-Wert enthalten.

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

Beim Offset werden die Margin-Werte für alle Objekte berücksichtigt. In diesem Fall hat X den Wert -4 und Y ebenfalls den Wert -4. Die Offsetwerte sind negative Werte, da das übergeordnete Objekt relativ zu dessen untergeordnetem Objekt negativ versetzt ist.

Siehe auch

Referenz

Visual

VisualTreeHelper

Konzepte

Übersicht über das WPF-Grafikrendering