C# 在一段时间内以编程方式调整网格控件的大小
G'day 我正在尝试用滑动标签模拟旧的XBox 360 GUI(记住,你会按左键或右键,内容会根据标签滑动进来?),无论如何,目前我的这个工作很好,但是我无法让“动画”工作 当用户按下左箭头或右箭头时,将调用my OpenWindow(int iIndex)方法,其中iIndex是要滑入的下一个或上一个“窗口”的索引。(不是窗口…每个“窗口”都是一个结构,其父网格控件包含一个按钮,较小的网格控件包含windows内容。) 现在,我的问题在于调整父网格控件的大小。当它滑入时,通过调用mygrid.Width+=1来调整大小;这是可行的,但我不认为它会在一段确定的时间内发生,它只是稍微滞后,然后调整到所需的宽度。然而,如果我用相同的方法调用这个.Width+=1,(这是主程序窗口),窗口将调整我希望网格控件调整大小的方式。我尝试了UpdateLayout(),但没有效果。这告诉我我的时机还可以 如果有人能提供帮助,我们将不胜感激 这是我的OpenWindow方法C# 在一段时间内以编程方式调整网格控件的大小,c#,.net-4.0,wpf-controls,C#,.net 4.0,Wpf Controls,G'day 我正在尝试用滑动标签模拟旧的XBox 360 GUI(记住,你会按左键或右键,内容会根据标签滑动进来?),无论如何,目前我的这个工作很好,但是我无法让“动画”工作 当用户按下左箭头或右箭头时,将调用my OpenWindow(int iIndex)方法,其中iIndex是要滑入的下一个或上一个“窗口”的索引。(不是窗口…每个“窗口”都是一个结构,其父网格控件包含一个按钮,较小的网格控件包含windows内容。) 现在,我的问题在于调整父网格控件的大小。当它滑入时,通过调用mygrid
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));
}
publicsvoidopenwindow(intiindex)
{
int IIInterval=1;
对于(int i=(int)myDict[iIndex].Shell.Width;i<(int)stack\u outter.Width;i+=iInterval)
{
myDict[iIndex].Shell.Width+=1;
myDict[iIndex].Shell.UpdateLayout();
系统线程线程睡眠(1);
}
myDict[iIndex].Shell.Width=stack_outter.Width-(BUTTON_Width*(myDict.Count-1));
}
myDict是一个字典,Shell是我在调整大小时试图设置动画的网格。很抱歉,代码太乱了,当我试图让东西正常工作时,我的代码总是被黑客攻击:)
谢谢
灰烬
您的OpenWindow方法正在Dispatcher线程上执行。这也是负责渲染的线程,因此只要OpenWindow方法不返回,就不会渲染任何内容 解决此问题的正确方法是设置宽度属性的动画。我没有任何从代码开始动画的经验(我过去只在鼠标上方使用淡入按钮高亮显示,这在WPF中更容易完成),但我快速阅读了这一页,我想你会想要这样的东西:
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);
非常感谢。我不知道应用程序运行在哪些不同的线程上。我想应该读点什么:)干杯。