0

私はc#、Silverlight、WP7を使用しています。

アプリにピボットがあり、各LoadedPivotItemイベントの後で、UIツリーを見て、各アイテムが画面上のどこにあるかを確認したいと思います。具体的には、画面左側からのxオフセットであるマージン値に関心があります。

これが私のコードです:

GeneralTransform gt = myUIElement.TransformToVisual(Application.Current.RootVisual);
double x = ((MatrixTransform)gt).Matrix.OffsetX;
Debug.WriteLine("Margin = {0}, UIElement = {1}", x, myUIElement);

アプリケーションが起動すると、このコードが実行され、印刷出力の例は次のとおりです。

Margin = 12, UIElement = System.Windows.Controls.TextBlock

問題は、スワイプして(LoadedPivotItemイベントが発生)、右側のピボットに移動すると、マージンが負の数になることです。例:

Margin = -468, UIElement = System.Windows.Controls.TextBlock

奇妙なことに、最初のピボットにスワイプして戻っても、余白の値は次のように変わります。

Margin = 492, UIElement = System.Windows.Controls.TextBlock

そして、一方向にスワイプし続けて最初のピボットに戻ると、マージンの値は次のようになります。

Margin = -468, UIElement = System.Windows.Controls.TextBlock

これらの数値はすべて画面サイズ480で相殺されていることに気づきましたが、私には一貫していないようで、画面サイズによる調整は扱いたくありません。

なぜこれが起こっているのか、そしてそれを修正する方法について何か提案はありますか?
前もって感謝します。

4

1 に答える 1

0

この問題の最も簡単な解決策を見つけました。それは、実際のマージンを取得するために、画面幅でxオフセットを%modすることです。ここでは、画面幅が480であると想定しています。

double x = ((MatrixTransform)gt).Matrix.OffsetX
if (x < 0)
{
    // modding a negative number is equal to the negative modding of the positive number
    x = 480 + (x % 480);
}
else
{
    x = x % 480;
} 

何度も左右に回転させた後、何が起こっているのか理解できたと思います。UIElementは、スワイプする方法に応じて正と負の変換を実行しますが、RootVisualの(0,0)位置がUIElementに対して変更されるため、左にスワイプすることと右にスワイプすることは互いに打ち消し合いません。

于 2012-09-18T15:45:36.633 に答える