簡體   English   中英

WPF InitializeComponent性能問題

[英]WPF InitializeComponent performance problems

我有一個WPF應用程序(.NET 4),它有一個主窗口,在主窗口內部顯示許多較小的UserControls 用戶執行的各種動作導致顯示的UserControls被具有不同數據的不同其他控件替換。

但是,在切換這些控件時,我遇到了性能問題。 在加載控件時,WPF調度程序線程轉到100%CPU。 在較舊的計算機上,或者控件數量較多時,這可能會導致應用程序鎖定長達30秒!

分析表明幾乎所有這些CPU時間都用於調用所有不同UserControls的各種InitializeComponent方法 - 沒有一個控件看起來比其他任何控件差得多,它們似乎都需要0.2到0.5秒(在我的開發機器上)一個快速的處理器和良好的圖形卡)。

據我所知, InitializeComponent是WPF實際將已編譯的xaml加載到內存中的地方。

我在這里做什么都不知所措。 我想在后台線程上預先初始化東西,但是必須在調度程序線程上創建和使用所有WPF控件,所以我認為這不可行。

否則它看起來像我唯一的選擇是刪除我的所有xaml?

任何幫助將不勝感激

重新審視這一點 - 我們在屏幕上有很多復雜的控件,但我們不能只是擺脫它們以保持WPF的快樂!

進一步的剖析實驗表明,使用Custom控件(基本上只是一個直接從Control派生的C#類,並在Generic.xaml主題文件中定義UI,似乎只會導致加載和解析XAML一次。之后,每個控件都適用已有的主題。

自定義控件比UserControls更難以使用,但這似乎確實有助於我們的負載性能。

為了記錄,我有一個加載時間約1500~2000毫秒的窗口,問題是圖標

我正在使用一個工具將SVG轉換為XAML DrawingImage元素,以及一個帶有大型資源字典的用戶控件,每個使用過的圖標都有一個繪圖圖像

InitializeComponent非常慢,因為它必須解析包含圖像的所有矢量數據的大型XAML文件

希望能幫助到你。

InitializeComponent方法需要時間,因為它需要在Visual / Logical樹中插入控件並確保所有綁定,主題,預期資源等。

我唯一的建議是 - 是否可以從一開始就初始化所有可能的控件,然后在需要時使用Visibility屬性顯示/隱藏它們?

您可以使用Freezable緩存某些UI,但如果它們是用戶控件,那么您很可能希望用戶與它們進行交互。

暫無
暫無

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

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