我正在使用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的屏幕尺寸所抵消,但它对我来说似乎并不一致,我不想按屏幕尺寸进行调整。
有关为何发生这种情况以及如何解决问题的任何建议? 提前谢谢。
答案 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会发生变化。