0

私はこれをやろうとしていますが、成功していません。

メトロアプリページにテキストブロックを含むスタックパネルと、背景色が黒のグリッド(グリッドの外側に配置されたgrdTheHelperという名前)があります(ページ内に持ち込んだときに表示されるように)

私の要件は、スタックパネルのテキストブロックをタッチ/クリックすると、クリックした場所に黒いグリッドが正確に表示されることです。

これはどのように可能ですか。私は試した

 Dim XY As New TranslateTransform

  Private Sub MainPage_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    grdTheHelper.RenderTransform = XY
  End Sub

 Private Sub txt1_Tapped(sender As Object, e As TappedRoutedEventArgs) Handles txt1.Tapped
         Dim AbsXY As Point
         AbsXY = e.GetPosition(Me)
         XY.X = AbsXY.X
         XY.Y = AbsXY.Y
    End Sub

しかし、これは、私が触れた場所からグリッドを少し遠ざけすぎています。私は無知です。私は何か間違ったことをしていますか?TranslateTransform は ManipulationDelta を処理してオブジェクトを移動するためだけのものですか? 他のものを使用する必要がありますか?私を助けてください。

4

1 に答える 1

0

このようなXAMLを使用している場合:

<Rectangle x:Name="Rect1" Fill="White" Height="100" Width="100" />

<Rectangle x:Name="Rect2" Fill="Green" Height="100" Width="100" 
            ManipulationMode="All"
            ManipulationDelta="Rect2_ManipulationDelta_1">
    <Rectangle.RenderTransform>
        <CompositeTransform x:Name="Rect2Transform" />
    </Rectangle.RenderTransform>
</Rectangle>

そして、このようなコード:

private void Rect2_ManipulationDelta_1(object sender, ManipulationDeltaRoutedEventArgs e)
{
    Rect2Transform.TranslateX += e.Delta.Translation.X;
    Rect2Transform.TranslateY += e.Delta.Translation.Y;

    var _Visual = Rect2.TransformToVisual(this);
    var _Location = _Visual.TransformPoint(new Point());

    Rect1.SetValue(Canvas.LeftProperty, _Location.X);
    Rect1.SetValue(Canvas.TopProperty, _Location.Y - 100);
}

上記のコードでは、ポインタが現在画面上にある場合は常にrect2を保持します。そして、そのメソッドは、rect1をrect2の新しい位置の真上に配置します。

これは、ポインティングデバイスから、または画面上のオブジェクトを基準にして絶対位置を取得する方法を正確に示しています。これがあなたの質問への答えです!

于 2012-10-05T22:42:19.983 に答える