0

我正在使用 c#、Silverlight、WP7。

我的应用程序中有一个 Pivot,在每个 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

奇怪的是,即使我滑回第一个 Pivot,边距上的值也会变为:

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

如果我继续向一个方向滑动并最终回到第一个 Pivot,则边距上的值变为:

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

我意识到这些数字都被 480 的屏幕尺寸所抵消,但对我来说似乎不一致,我不想处理通过屏幕尺寸进行的调整。

关于为什么会发生这种情况以及如何解决它的任何建议?
提前致谢。

4

1 回答 1

0

我已经找到了解决这个问题的最简单的方法,那就是用屏幕宽度 %mod x 偏移量来获得实际的边距。这里我假设屏幕宽度是 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 回答