[英]How can I suspend and resume layout in WPF?
如何在 WPF 中暫停和恢復布局? 我聽說這沒有必要。 但這是非常必要的!
我處理了很多變化位置,如果將它們一個一個渲染,就會產生延遲效果。
下面是一些代碼:
CompositionTarget.Rendering += new EventHandler(Draw);
void Draw(object sender, EventArgs e)
{
//Clean screen
for (int i = mainCanvas.Children.Count - 1; i > -1; i--)
{
if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image)
{
mainCanvas.Children.Remove(mainCanvas.Children[i]);
}
}
//DRAW FLOOR AROUND
FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id);
for...
{
Image image = new Image();
image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative));
mainCanvas.Children.Add(image);
}
//DRAW PLAYERS AROUND
//Its similar as draw floors around.
...
}
WPF 是一個保留的合成引擎。 這意味着您不必自己通過掛鈎Rendering
事件來進行Rendering
,而是使用將放置在樹中的節點來組合圖像。 有關 WPF 架構的詳細信息,請參見此處: WPF 架構。 我可以向您保證,如果您完全理解本文檔以及 Rick Sladkey 發送的布局系統鏈接,您還應該理解如果您想繼續使用 WPF,為什么應該更改代碼。
如果您使用 WPF 正確地使用它(即:使用依賴屬性,例如覆蓋 Measure 和Arrange 方法),您將看到它是一個非常強大的引擎,能夠在圖形樹中顯示數千個節點。 我推薦另一個有用的閱讀: ZoomableApplication2: A Million Items
您沒有提供足夠的信息,只是說您“處理了很多更改”。 但是,如果您進行所有這些更改:
UpdateLayout
,和然后在這些更改之間不會發生布局。 因此,沒有什么可以暫停或恢復,因為布局總是推遲到您進行這些類型的更改返回之后。
因此,如果您遇到延遲,則不是因為您沒有通過 WinForms 批量處理布局更改。 因此,減少延遲的唯一方法,如果確實是由於布局引起的,則是避免不必要的布局重新計算。 同樣,不知道你在做什么,就不可能提出任何具體的建議。 但是有許多屬性可以避免觸發遞歸布局傳遞。 請參閱本文中的布局性能注意事項:
您是否考慮過首先從窗口中刪除畫布以隱藏它,然后清除並將所有項目重新添加到畫布,然后將畫布重新添加回窗口?
他清楚地發布了足夠多的信息,以至於即使是 wpf 經驗有限的我也確切地知道他在說什么。
所以簡而言之,他有一個過程,在這個過程中元素被添加/或操作(我假設在循環中),他希望在循環中凍結渲染過程,因為我假設是 1。你可以看到渲染過程地方和 2. 它很慢
上面有一篇文章提到先移除畫布……差不多就是這樣。 只需將主要父級的可見性設置為折疊,執行元素添加/操作,然后使父級可見
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.