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