簡體   English   中英

如何在 WPF 中暫停和恢復布局?

[英]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

您沒有提供足夠的信息,只是說您“處理了很多更改”。 但是,如果您進行所有這些更改:

  • 依次
  • 從 UI 線程
  • 不調用UpdateLayout ,和
  • 不歸

然后在這些更改之間不會發生布局。 因此,沒有什么可以暫停或恢復,因為布局總是推遲到您進行這些類型的更改返回之后。

因此,如果您遇到延遲,則不是因為您沒有通過 WinForms 批量處理布局更改。 因此,減少延遲的唯一方法,如果確實是由於布局引起的,則是避免不必要的布局重新計算。 同樣,不知道你在做什么,就不可能提出任何具體的建議。 但是有許多屬性可以避免觸發遞歸布局傳遞。 請參閱本文中的布局性能注意事項

您是否考慮過首先從窗口中刪除畫布以隱藏它,然后清除並將所有項目重新添加到畫布,然后將畫布重新添加回窗口?

他清楚地發布了足夠多的信息,以至於即使是 wpf 經驗有限的我也確切地知道他在說什么。

所以簡而言之,他有一個過程,在這個過程中元素被添加/或操作(我假設在循環中),他希望在循環中凍結渲染過程,因為我假設是 1。你可以看到渲染過程地方和 2. 它很慢

上面有一篇文章提到先移除畫布……差不多就是這樣。 只需將主要父級的可見性設置為折疊,執行元素添加/操作,然后使父級可見

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM