次の方法で共有


方法 : ビジュアルのオフセットを取得する

この例では、親、先祖、または子孫を基準とした相対値である、ビジュアル オブジェクトのオフセット値を取得する方法を示します。

使用例

次に示すマークアップの例では、TextBlockMargin の値に 4 が指定されています。

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

GetOffset メソッドを使用して TextBlock のオフセットを取得する方法を次の例に示します。 オフセット値は、返される Vector 値に含まれます。

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

オフセットでは、Margin 値が考慮されます。 ここでは、X は 4 で、Y も 4 です。

返されるオフセット値は、Visual の親を基準とする相対値です。 Visual の親が基準ではないオフセット値を返す必要がある場合は、TransformToAncestor メソッドを使用します。

先祖を基準としたオフセットの取得

2 つの StackPanel オブジェクトの中で入れ子になっている TextBlock のマークアップ例を次に示します。

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

マークアップの結果を次の図に示します。

2 つの StackPanel 内で入れ子にされた TextBlock

オブジェクトのオフセット値

TransformToAncestor メソッドを使用して、TextBlock のオフセットを、このオブジェクトを格納している Window を基準として取得する方法を次のコード例に示します。 オフセット値は、返される GeneralTransform 値に格納されています。

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

オフセットの値は、そのオブジェクトを格納している Window 内のすべてのオブジェクトの Margin 値を考慮して計算されます。 この例では、X は 28 (16 + 8 + 4) で、Y も 28 です。

返されるオフセット値は、Visual の先祖を基準としています。 Visual の子孫を基準とするオフセット値を返す必要がある場合は、TransformToDescendant メソッドを使用します。

子孫を基準としたオフセットの取得

StackPanel オブジェクトに格納されている TextBlock のマークアップ例を次に示します。

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

TransformToDescendant メソッドを使用して、子 TextBlock を基準にして StackPanel のオフセットを取得する方法を次のコード例に示します。 オフセット値は、返される GeneralTransform 値に含まれます。

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

オフセットでは、すべてのオブジェクトの Margin 値が考慮されます。 ここでは、X は -4 で、Y も -4 です。 これらのオフセット値が負の値である理由は、子オブジェクトを基準とした親オブジェクトのオフセットが負のオフセットであるためです。

参照

参照

Visual

VisualTreeHelper

概念

WPF グラフィックス レンダリングの概要