2014-03-19 49 views
0

我正在處理非常複雜的WPF窗口,並且有很多控件。 在我的上下文中,我們選擇的用戶體驗是首先顯示窗口,然後加載數據和數據綁定(同時顯示進度條)。InitializeComponent/ShowDialog和databinding

使用WPF的幫助下追蹤在Visual Studio中,我注意到,數據綁定被調用兩次所示的窗口前:

  1. 當我們調用的InitializeComponent(),它解析XAML。
  2. 當我們調用ShowDialog()。

因爲還沒有數據,所以數據綁定機制需要一段時間來嘗試回退和默認值。

爲了加快窗口顯示給用戶,是否有辦法禁用WPF數據綁定,直到顯示窗口?

在此先感謝。

編輯1: 我有更多的400控件的形式。對InitializeComponent()的調用需要700ms才能完成。我不知道這與數據綁定有多大關係,可能是我錯了。

編輯2: 根據dotTrace探查,InitilizeComponent()WPF成本65.43%在分爲:

  • 34.25%System.Windows
  • 22.57%System.Windows.Markup
  • 8.29%其他

編輯3: 對於InitializeComponent(),我們降低到了272毫秒。 我們有很多轉換器,現在全部使用singletons

+0

你能在每個階段提供毫秒數嗎? – Artru

+0

有關InitializeComponent的信息,請參閱編輯1。在窗體關閉之前,ShowDialog不會返回,這可能有點難以衡量。 –

回答

0

當然。

一個直接的選擇是刪除與數據綁定相關的XAML標記,並從代碼隱藏中做同樣的事情,但只能在窗口顯示之後(或者在您認爲合適的任何其他條件下)。關於如何在代碼中進行數據綁定,請參見MSDN example

另一種選擇是不直接綁定到你的「真實」數據源(目前還不清楚爲什麼會導致一個放緩,但我正在接受你的話),而是代理具有開/關的對象開關:從關閉開關開始,使代理返回空數據集,並在窗口顯示後打開它。

+0

我有更多的表單上的400控件。對InitializeComponent()的調用需要700ms才能完成。我不知道這與數據綁定有多大關係,可能是我錯了。 –

+0

@omatrot:找到一個簡單的方法是刪除所有綁定。在任何情況下,'InitializeComponent'負責解析頁面的BAML(「編譯XAML」),實例化所有控件並將所有東西連線 - 基本上,您通常需要從代碼執行的所有操作,以及您在Windows中看到的內容Forms .designer.cs文件。 700ms確實聽起來很多,但是爲什麼會發生這樣的事情是不可能的。 – Jon

0

有趣的一點。約束時間如此之大?

InitializeComponent()DataContext通常爲空,解析綁定需要幾毫秒的時間。問題可能在另一個地方。

在DataBinding機制中使用默認值清晰,快速和簡單。