The run order about Loaded event and OnApplyTemplate in custom control of Silverlight 2 beta 2

来源:互联网 发布:晋中教育网网络教研 编辑:程序博客网 时间:2024/05/19 11:44

I' ve created a customer control MenuLink.cs in silverlight 2beta2, and the code like this:

  1. public class MenuLink : Control
  2.  { 
  3.         public MenuLink( )
  4.         {          
  5.             DefaultStyleKey = typeof(MenuLink);
  6.             this.Loaded += new RoutedEventHandler(MenuLink_Loaded);
  7.         }
  8.         void MenuLink_Loaded(object sender, RoutedEventArgs e)
  9.         {
  10.             
  11.         }
  12.        
  13.         public override void OnApplyTemplate()
  14.         {
  15.             base.OnApplyTemplate();           
  16.         }
  17. }

There is a canvas named 'canMenu' in page 'Page.xaml', and i add the menulink into the canvas dynamicly:

  1.  public Page()
  2.         {
  3.             InitializeComponent();
  4.             this.Loaded += new RoutedEventHandler(Page_Loaded);            
  5.         } 
  6.         void Page_Loaded(object sender, RoutedEventArgs e)
  7.         {
  8.             MenuLink ml = new MenuLink(true);            
  9.             canMenu.Children.Clear();
  10.             canMenu.Children.Add(ml);
  11.         }

In this situation, the event in MenuLink.cs are called by this orders:

  1. 1. public MenuLink( bool a )
  2. 2. void MenuLink_Loaded(object sender, RoutedEventArgs e)
  3. 3. public override void OnApplyTemplate()

But if i add the menulink after downloading a xml file in page.cs like this:

  1.   public Page()
  2.         {
  3.             InitializeComponent();
  4.             this.Loaded += new RoutedEventHandler(Page_Loaded);            
  5.         } 
  6.         void Page_Loaded(object sender, RoutedEventArgs e)
  7.         {
  8.             WebClient webclient = new WebClient();
  9.             webclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webclient_DownloadStringCompleted);
  10.             webclient.DownloadStringAsync(new Uri("a.xml",UriKind.Relative));          
  11.         }
  12.         void webclient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
  13.         {
  14.             MenuLink ml = new MenuLink(true);            
  15.             canMenu.Children.Clear();
  16.             canMenu.Children.Add(ml);
  17.         }

Then the order of events/methods called in MenuLink.cs like this:

  1. 1. public MenuLink( bool a )
  2. 2. public override void OnApplyTemplate()
  3. 3. void MenuLink_Loaded(object sender, RoutedEventArgs e)

 

I really don't know why?????