2010-04-29 84 views
0

下面的代碼是一個Silverlight應用程序,但在WPF同樣的情況,所以它似乎只是我丟失的東西關於委託,事件等爲什麼這個C#事件處理程序不響應此事件?

誰能告訴我,爲什麼下面的代碼執行成功本次活動:

OnLoadingComplete(this, null); 

,但從來沒有執行該事件處理程序? CODE

void initialDataLoader_OnLoadingComplete(object obj, DataLoaderArgs args) 

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

你在調試模式下編譯? – 2010-04-29 13:01:58

+0

是的,並通過調試器,我發現它永遠不會到達事件處理程序 – 2010-04-29 13:03:14

回答

7

你註冊的處理程序只有後,你開始加載:

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

你的代碼是目前寫入的方式,看起來像BeginLoading()阻塞直到完成,這意味着處理程序將永遠不會被調用,因爲直到完成加載後才設置它。

+0

+1。很好地發現。 – 2010-05-01 01:43:36

相關問題