G'day,
我试图用滑动标签模拟旧的XBox 360 GUI(记住,你要向左或向右按,内容会根据标签滑入?)无论如何,此刻,我的工作效果很好但是我不能让“动画”工作。
当用户按下向左箭头或向右箭头时,将调用我的OpenWindow(int iIndex)方法,其中iIndex是要滑入的下一个或上一个“窗口”的索引。(不是窗口...每个“Window”是一个带有父网格控件的结构,其中包含一个按钮和一个包含窗口内容的较小网格控件。)
现在,我的问题在于调整父网格控件的大小。当它滑入时,通过调用mygrid.Width + = 1调整其大小;这是有效的,但我没有看到它在一段确定的时间内发生,它只是滞后一点然后调整到所需的宽度。然而,如果我在同一方法中调用this.Width + = 1(这是主程序窗口),窗口会调整我希望网格控件调整大小的方式。我试过UpdateLayout()但无济于事。这告诉我我的时机还可以。
如果有人可以提供帮助,我们将不胜感激。
这是我的OpenWindow方法......
public void OpenWindow(int iIndex)
{
int iInterval = 1;
for (int i = (int)myDict[iIndex].Shell.Width; i < (int)stack_outter.Width; i += iInterval)
{
myDict[iIndex].Shell.Width += 1;
myDict[iIndex].Shell.UpdateLayout();
System.Threading.Thread.Sleep(1);
}
myDict[iIndex].Shell.Width = stack_outter.Width - (BUTTON_WIDTH * (myDict.Count - 1));
}
myDict是一个词典,Shell是我在调整大小时试图制作动画的网格。对于代码感到抱歉,这很麻烦,当我试图让工作变得有效时,我的代码总是被黑了。)
谢谢,
灰
答案 0 :(得分:0)
您的OpenWindow方法正在Dispatcher线程上发生。这也是负责渲染的线程,因此只要您的OpenWindow方法不返回,就不会呈现任何内容。
解决此问题的正确方法是为Width属性设置动画。我没有任何从代码启动动画的经验(我过去只使用它们来处理鼠标悬停时的淡入按钮突出显示,这更容易从WPF完成),但我快速阅读了 - 通过这个页面Animation Overview on MSDN,我想你会想要这样的东西:
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = myDict[iIndex].Shell.Width;
myDoubleAnimation.To = stack_outter.Width;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));
myDoubleAnimation.AutoReverse = false;
myDoubleAnimation.RepeatBehavior = new RepeatBehavior(1.0);
myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTarget(myDoubleAnimation, myDict[iIndex].Shell);
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(FrameworkElement.WidthProperty));
myStoryboard.Begin(myDict[iIndex].Shell);