2010-08-26 45 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

相关问题