2013-02-11 80 views
0

在我的構造我的Silverlight 4頁,我打電話的InitializeComponent,之後緊接着就是這樣的說法:是Silverlight中的InitializeComponent異步

OriginalDefaultCharts = new Dictionary<Chart, string>{ 
    { chartTop, ((ComboBoxItem) comboInstant.SelectedItem).Tag.ToString () }, 
    { chartBottom, ((ComboBoxItem) comboCumulative.SelectedItem).Tag.ToString () } }; 

這幾乎總是工作,但有時,這種說法將拋出一個空例外,因爲comboCumulative一片空白。

我看到哪裏comboCumulative在InitializeComponent中實例化,但由於這通常有效,但並非總是如此,它使我認爲有些事情我應該等待。將InitializeComponent之後的所有構造函數邏輯放入Loaded事件是否是典型的?

我做到了,但由於我的代碼之前很少失敗,所以我不能100%確定我已經解決了這個問題。

回答

0

你這樣做。

是的,對Initialize組件的調用是異步的(更具體地說,UI組件的構建是異步的)。

因此,在初始化組件之後對UI元素執行任何操作(實際上最好不要在InitializeComponent後面實現aynthing:讓您的默認構造函數清晰明瞭),這是非常糟糕的做法。

好的做法是在加載的事件中執行這些操作。

雖然,即使在你的加載事件中,也要注意一些UI元素(特別是不可見的元素)仍然不會被創建。

+0

何時可以確定所有組件都已實例化? – 2013-02-12 14:13:46

+0

在加載的事件中,如果所有UI元素都可見,否則沒有直接的方法來知道它,只能確保等待每個UI組件的加載事件。 – Ouarzy 2013-02-12 14:37:57