2010-08-26 33 views
2

我有以下內容的簡單的用戶控制:在Silverlight如何在聲明的事件處理程序XAML未連線

<Grid x:Name="LayoutRoot"> 

    <Button x:Name="btnOpenGenericPage" Click="btnOpenGenericPage_Click" Content="Open"/> 

</Grid> 

我瞭解Click事件處理程序中創建和有線起來 - 在InitializeComponent方法> .g.cs類的System.Windows.Application.LoadComponent方法被調用並完成所有魔術。

但是,一旦從VisualTree中刪除了此控件,我似乎無法理解事件的未連線是否正在發生。如果是,誰照顧這個?有沒有什麼情況下,事件不會無線連接?有人可以解釋一下這個問題嗎?

非常感謝, 布魯諾。

回答

1

它不會自行斷線。你必須自己做: -

btnOpenGenericPage.click -= btnOpenGenericPage_Click 

不僅如此,但你要確保btOpenGenericPage被釋放,你需要: -

btnOpenGenericPage = null; 

當然如果UsercontrolbtnOpenGenericPage被定位本身被從樹中移除,這樣它就成爲垃圾收集的可用資源,那麼你通常不需要做任何事情。

+0

據我瞭解,EventHandler將持有對btnOpenGenericPage所在的UserControl的引用。鑑於此,因爲如果我們不解除事件的關聯,此參考文件將保持活躍狀態​​,那麼UserControl將如何確認GC?非常感謝! – Bruno 2010-08-27 08:55:28

+0

@Bruno:引用「UserControl」的事件處理程序並不意味着它不能被收集。如果您無法通過引用全局級別引用的某個引用或一個線程堆棧中的某個引用來追蹤該項目是否可以收集。例如,如果您有此循環引用UserControl-> Button-> ClickEvent-> UserControl,則可以收集'UserControl'和'Button',如果沒有別的引用它們的話。它們互相引用並不重要,它們通過普通代碼無法訪問。 – AnthonyWJones 2010-08-27 16:12:56

+0

嗨安東尼,感謝您的澄清,現在我似乎理解我手中的問題。乾杯。 – Bruno 2010-08-27 16:19:08

1

Visual Studio通過從生成的代碼中刪除它來解除它。該方法可能會保留在代碼隱藏文件中,但它已斷開連接並且不會運行。

+0

我認爲你錯誤地理解了這個問題,這個問題涉及在__runtime__期間從樹中刪除一個控件。 – AnthonyWJones 2010-08-26 17:31:03

+0

如果我不清楚,我很抱歉。但是我想知道在運行時將控件從樹中移除時誰負責解除事件處理程序的負責 - 並且恰好在這種情況下發生。 – Bruno 2010-08-26 18:00:48

相關問題