2010-04-29 5 views
0

Le code suivant est une application silverlight mais la même chose se produit dans WPF, il semble être quelque chose qui me manque en ce qui concerne le délégué, événement, etc.Pourquoi ce gestionnaire d'événements C# ne répond pas à cet événement?

Quelqu'un peut-il me dire pourquoi le code suivant exécute avec succès cet événement:

OnLoadingComplete(this, null); 

mais exécute jamais ce gestionnaire d'événements?

void initialDataLoader_OnLoadingComplete(object obj, DataLoaderArgs args) 

CODE:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Controls; 
using System.Diagnostics; 

namespace TestEvent22928 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      DataLoader initialDataLoader = new DataLoader("initial"); 
      initialDataLoader.RegisterText("test1", "http://test:111/testdata/test1.txt"); 
      initialDataLoader.RegisterText("test2", "http://test:111/testdata/test2.txt"); 
      initialDataLoader.BeginLoading(); 
      initialDataLoader.OnLoadingComplete += new DataLoader.LoadingComplete(initialDataLoader_OnLoadingComplete); 
     } 

     void initialDataLoader_OnLoadingComplete(object obj, DataLoaderArgs args) 
     { 
      Debug.WriteLine("loading complete"); //WHY DOES EXECUTION NEVER GET HERE? 
     } 
    } 


    public class DataManager 
    { 
     public DataLoader CreateDataloader(string dataloaderIdCode) 
     { 
      DataLoader dataLoader = new DataLoader(dataloaderIdCode); 
      return dataLoader; 
     } 
    } 

    public class DataLoader 
    { 
     public string IdCode { get; set; } 
     public List<DataItem> DataItems { get; set; } 

     public delegate void LoadingComplete(object obj, DataLoaderArgs args); 
     public event LoadingComplete OnLoadingComplete = delegate { }; 

     private int dataItemCurrentlyLoadingIndex; 

     public DataLoader(string idCode) 
     { 
      IdCode = idCode; 
      DataItems = new List<DataItem>(); 
      dataItemCurrentlyLoadingIndex = -1; 
     } 

     public void RegisterText(string idCode, string absoluteSourceUrl) 
     { 
      DataItem dataItem = new DataItem 
      { 
       IdCode = idCode, 
       AbsoluteSourceUrl = absoluteSourceUrl, 
       Kind = DataItemKind.Text 
      }; 
      DataItems.Add(dataItem); 
     } 

     public void BeginLoading() 
     { 
      LoadNext(); 
     } 

     private void LoadNext() 
     { 
      dataItemCurrentlyLoadingIndex++; 
      if (dataItemCurrentlyLoadingIndex < DataItems.Count()) 
      { 
       DataItem dataItem = DataItems[dataItemCurrentlyLoadingIndex]; 
       Debug.WriteLine("loading " + dataItem.IdCode + "..."); 
       LoadNext(); 
      } 
      else 
      { 
       OnLoadingComplete(this, null); //EXECUTION GETS HERE 
      } 
     } 
    } 

    public class DataItem 
    { 
     public string IdCode { get; set; } 
     public string AbsoluteSourceUrl { get; set; } 
     public DataItemKind Kind { get; set; } 
     public object DataObject { get; set; } 
    } 

    public enum DataItemKind 
    { 
     Text, 
     Image 
    } 

    public class DataLoaderArgs : EventArgs 
    { 
     public string Message { get; set; } 
     public DataItem DataItem { get; set; } 

     public DataLoaderArgs(string message, DataItem dataItem) 
     { 
      Message = message; 
      DataItem = dataItem; 
     } 
    } 
} 
+0

compilez-vous en mode débogage? –

+0

oui, et en passant par le débogueur, je vois qu'il n'arrive jamais au gestionnaire d'événements –

Répondre

7

Vous vous inscrivez le gestionnaire ne après commencer le chargement:

 initialDataLoader.BeginLoading(); 
     initialDataLoader.OnLoadingComplete += new DataLoader.LoadingComplete(initialDataLoader_OnLoadingComplete); 

La façon dont votre code est actuellement écrit, il ressemble à BeginLoading() bloque jusqu'à la fin, ce qui signifie que le gestionnaire ne sera jamais appelé, car vous ne le définissez qu'après le chargement.

+0

+1. joliment repéré. –

Questions connexes