2013-02-11 72 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