C# 在一段时间内以编程方式调整网格控件的大小

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

G'day

我正在尝试用滑动标签模拟旧的XBox 360 GUI(记住,你会按左键或右键,内容会根据标签滑动进来?),无论如何,目前我的这个工作很好,但是我无法让“动画”工作

当用户按下左箭头或右箭头时,将调用my OpenWindow(int iIndex)方法,其中iIndex是要滑入的下一个或上一个“窗口”的索引。(不是窗口…每个“窗口”都是一个结构,其父网格控件包含一个按钮,较小的网格控件包含windows内容。)

现在,我的问题在于调整父网格控件的大小。当它滑入时,通过调用mygrid.Width+=1来调整大小;这是可行的,但我不认为它会在一段确定的时间内发生,它只是稍微滞后,然后调整到所需的宽度。然而,如果我用相同的方法调用这个.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));
    }
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);

非常感谢。我不知道应用程序运行在哪些不同的线程上。我想应该读点什么:)干杯。