2012-04-02 65 views
0

我有一個用Silverlight for Windows Phone編寫的非常簡單的應用程序,我嘗試使用事件。在我的App.xaml.cs代碼中,我實現了一個GeoCoordinateWatcher,它註冊了一個gCWatche_PositionChanged方法。這可以正常工作,方法在位置更改後調用。 我想要做的就是觸發其他事件可以說DB更新後的數據庫已在gCWatche_PositionChanged方法中更新。WPF中的事件消耗

爲此,我delclared在App.xaml.cs

public delegate void DBUpdateEventHandler(object sender, EventArgs e); 

,我有我的應用程序類:

public event DBUpdateEventHandler DBUpdated; 

的事件在gCWatche_PositionChanged方法像結束時觸發這樣這樣的:

 OnDBUpdateEvent(new EventArgs()); 

,也是我宣佈:

protected virtual void OnDBUpdateEvent(EventArgs e) 
    { 

     if (DBUpdated != null) 
     { 

      DBUpdated(this, e); 
     } 

    } 

現在我需要其他Windows Phone應用程序頁面這是一個單獨的類的PhoneApplicationPage消費這個事件

所以我宣佈這個其他電話頁本方法:

public void DBHasBeenUpdated(object sender, EventArgs e) 
    { 
     Debug.WriteLine("DB UPDATE EVENT CATCHED"); 
    } 

,該頁面的構造,我宣佈:

 DBUpdateEventHandler dbEH = new DBUpdateEventHandler(DBHasBeenUpdated); 

但是當我測試應用程序事件被觸發(OnDBUpdateEvent被稱爲,但DBUpdated爲空,因此DBUpdated不叫 - 奇怪),我有一個問題,其他電話頁是根本沒有捕獲事件...

有什麼建議嗎?如何捕捉該事件。

謝謝。

回答

1

您應該將事件創建爲靜態事件。

public static event DBUpdateEventHandler DBUpdated; 

而且處理程序應與事件,如下面的頁面構造附:

App.DBUpdated+=new DBUpdateEventHandler(DBHasBeenUpdated); 
+0

是的,這是它的工作方式! PERFECTO!謝謝 – webaloman 2012-04-02 11:43:29

0

當我們想註冊一個事件,我們不喜歡它:

class A 
{ 
    public event DBUpdateEventHandler DBUpdated; 
} 

class B 
{ 
    private A _a; 
    //let requirement want to register when the object is initialized 
    constructor() 
    { 
     _a = new A(); 
     _a.DBUpdated += OnDBUpdateEvent; 
    } 
} 

在你的情況下,你可以讓你的事件靜態成員。 並註冊在你PhoneApplicationPage爲:

App.DBUpdated -= DBHasBeenUpdated; 
App.DBUpdated += DBHasBeenUpdated;