无法更新按钮的margin属性以使其动画化

时间:2014-02-12 16:47:03

标签: c# button windows-phone-8 margin transformation

我有一个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(),甚至添加了一个画布,但没有做到:按钮只更新什么时候结束,从来没有。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

快速更新,适用于任何可能遇到同样问题的人:

确实,正如steveg89所说,你无法直接从GUI线程更新UIElements。他给出的链接建议使用后台工作人员或代表来使其工作。不幸的是,WP8也不允许这样做。

唯一的解决方案是切换到故事板动画:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206955(v=vs.105).aspx

对于绝对的初学者来说并不是非常容易,但是当你花时间了解这些是如何工作的以及它们的不同类型(简单的动画,关键帧动画或路径动画(但Windows Phone中不支持路径动画)时,它可以正常工作。失去了相当多的时间。))