C# 在silverlight中,如何在xaml中声明事件处理程序

C# 在silverlight中,如何在xaml中声明事件处理程序,c#,silverlight,C#,Silverlight,我有一个简单的用户控件,包含以下内容: <Grid x:Name="LayoutRoot"> <Button x:Name="btnOpenGenericPage" Click="btnOpenGenericPage_Click" Content="Open"/> </Grid> 我了解如何在.g.cs类的InitializeComponent方法上创建和连接click事件处理程序->调用System.Windows.Application.Lo

我有一个简单的用户控件,包含以下内容:

<Grid x:Name="LayoutRoot">

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

</Grid>

我了解如何在.g.cs类的InitializeComponent方法上创建和连接click事件处理程序->调用System.Windows.Application.LoadComponent方法,所有的魔术都完成了

然而,一旦将此控件从VisualTree中移除,我似乎不明白是否正在发生事件的解除。如果是,由谁负责?是否有任何情况下活动不会被取消?有人能解释一下这个问题吗

多谢各位,
Bruno。

Visual Studio通过从生成的代码中删除它来解除其锁定。该方法可能保留在代码隐藏文件中,但它已断开连接且不运行

它不会自行解除锁定。你必须自己做:-

btnOpenGenericPage.click -= btnOpenGenericPage_Click
不仅如此,如果您想确保发布btOpenGenericPage,您还需要:-

btnOpenGenericPage = null;

当然,如果
btnOpenGenericPage
所在的
Usercontrol
本身被从树中删除,这样它就可以进行垃圾收集,那么您通常不需要做任何事情

我认为您误解了这个问题,这个问题涉及到在运行时从树中删除控件。如果我不清楚的话,我很抱歉。但我想了解当控件在运行时从树中移除时,谁负责取消事件处理程序的链接,以及具体是在什么时候发生的。据我所知,事件处理程序将保留对btnOpenGenericPage所在的UserControl的引用。既然如此,如果我们不取消对事件的调用,那么这个引用将是活动的,那么UserControl对于GC来说如何是可省略的呢?非常感谢@Bruno:引用
UserControl
的事件处理程序并不自动意味着无法收集它。如果无法通过引用回溯到当前在全局级别或线程堆栈中引用的某个对象,则该项可以省略以进行收集。例如,如果您有此循环引用UserControl->Button->ClickEvent->UserControl,则可以收集
UserControl
,如果没有其他引用按钮,则可以收集
按钮。事实上,它们相互引用并不重要,它们是普通代码无法访问的。嗨,安东尼,谢谢你的澄清,现在我似乎明白了我手头的问题。干杯