[英]Resizing a grid control programatically over a period of time
G'day,
我正在嘗試使用滑動選項卡模擬舊的XBox 360 GUI(還記得,您按向左或向右,內容是否會根據選項卡滑動?)無論如何,目前,我的工作情況很好,但是我無法使“動畫”正常工作。
當用戶按下向左箭頭或向右箭頭時,將調用我的OpenWindow(int iIndex)方法,其中iIndex是要滑入的下一個或上一個“窗口”的索引。(不是窗口...每個“ Window”是一個結構,其父網格控件包含一個按鈕,而較小的網格控件包含Windows內容。)
現在,我的問題在於調整父網格控件的大小。 滑入時,通過調用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是一個Dictionary,Shell是我在調整大小時嘗試設置動畫的網格。 抱歉,代碼很混亂,當我嘗試使某些東西正常工作時,我的代碼總是被黑掉:)
謝謝,
灰
您的OpenWindow方法發生在Dispatcher線程上。 這也是負責渲染的線程,因此只要您的OpenWindow方法不返回,就不會渲染任何內容。
解決此問題的正確方法是設置Width屬性的動畫。 我沒有從代碼開始制作動畫的經驗(過去我只使用它們來完成諸如鼠標懸停時的淡入按鈕突出顯示等操作,而這在WPF中更容易完成),但是我快速閱讀了一下-在此頁面上,即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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.