我有一个WP8应用程序,我在车轮上显示按钮。单击时,我希望转动轮子并将单击的按钮置于其顶部。
我正在放置带有margin属性的按钮。我想我会使用一个双循环来按顺序沿着圆度移动按钮,就像这样(试图尽可能地简化它):
private void Select(Button selectedButton)
{
Button[] SelectedButtons = { button1, button2, button3 };
//Calculates the distance between buttons in degrees
double buttonDistance = 360 / SelectedButtons.Length;
double angleDeg;
double angleRad;
int i = 0;
int j = 0;
//While the selected button hasn't reach top position, move the wheel
while (selectedButton.Margin != new Thickness(<top position of the wheel>)
{
//Moves the buttons of a single degree
while (i < SelectedButtons.Length)
{
//Calculates the position of the current button in the array in degrees and converts it in radians
angleDeg = j + 90 + i * buttonDistance;
angleRad = Math.PI * angleDeg / 180;
//Button positioning
SelectedButtons[i].Margin = new Thickness(<calculation of the margins with the given angles>);
i++;
}
System.Threading.Thread.Sleep(5);
j++;
i = 0;
}
}
然而,即使使用Sleep()函数,按钮的位置只会在循环结束后更新,并且不会像我想要的那样动画。
我尝试在循环中使用UpdateLayout(),在ContentPanel和Buttons本身上,我尝试了InvalidateArrange()和InvalidateMeasure(),甚至添加了一个画布,但没有做到:按钮只更新什么时候结束,从来没有。
你能帮帮我吗?
答案 0 :(得分:0)
快速更新,适用于任何可能遇到同样问题的人:
确实,正如steveg89所说,你无法直接从GUI线程更新UIElements。他给出的链接建议使用后台工作人员或代表来使其工作。不幸的是,WP8也不允许这样做。
唯一的解决方案是切换到故事板动画:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206955(v=vs.105).aspx
对于绝对的初学者来说并不是非常容易,但是当你花时间了解这些是如何工作的以及它们的不同类型(简单的动画,关键帧动画或路径动画(但Windows Phone中不支持路径动画)时,它可以正常工作。失去了相当多的时间。))