在枢轴事件之后,TransformToVisual值会发生变化

时间:2012-09-18 15:06:16

标签: c# silverlight windows-phone-7 pivot

我正在使用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的屏幕尺寸所抵消,但它对我来说似乎并不一致,我不想按屏幕尺寸进行调整。

有关为何发生这种情况以及如何解决问题的任何建议? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决这个问题的最简单方法,那就是用屏幕宽度修改x-offset来获得实际的边距。这里我假设屏幕宽度为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;
} 

多次左右旋转后,我想我已经弄明白了发生了什么。根据您的滑动方式,UIElements正在进行正面和负面翻译,但是向左滑动和向右滑动不会相互抵消,因为RootVisual的(0,0)位置相对于UIElement会发生变化。