【问题标题】:In wpf, is there a way to execute code before the control is unloaded...? like maybe an unloading event?在wpf中,有没有办法在控件卸载之前执行代码......?可能是卸载事件?
【发布时间】:2015-04-29 18:02:44
【问题描述】:

我需要在卸载 wpf 用户控件之前执行代码,如果满足某些条件则取消卸载并在 ui 中保持控件处于当前状态...

有什么办法可以做到这一点吗?我看不到卸载事件之类的东西? 谢谢,

【问题讨论】:

  • 你的用例是什么?听起来你想要像 Window.Closing 这样工作的东西,这与取消 FrameworkElement.Unloaded 事件有很大不同。当一个元素被卸载时,父母和兄弟姐妹的布局可能会发生很多事情。
  • 我也有类似的问题,以防万一你能帮我stackoverflow.com/questions/5310724/…

标签: c# wpf wpf-controls


【解决方案1】:

Unloaded 在从 WPF 可视化树中删除控件时触发。据我所知,我认为在 Windows 窗体中没有“卸载”事件。但是,“Unloaded”并不意味着该控件被销毁,只是它已从可视化树中移除。

在代码中的单独位置保留对控件的引用,以及有关其父控件的一些元数据。您可以通过在您的 Initialized 事件处理程序中存储对 Parent 属性的引用来收集该元数据。

然后,当调用Unloaded 时,在Unloaded 事件处理程序中进行测试,如果满足您的条件,将控件重新插入到逻辑树中。 ContentControl 类有一个可以调用的显式 AddChild 受保护方法。

可能有一些副作用需要注意;根据文档,Unloaded 会在操作系统级别更改主题时调用,此时 WPF 可视化树会自行重组。

【讨论】:

    【解决方案2】:

    System.Windows.Controls.Control 上有一个Unloaded 事件,但我不知道用它来停止卸载控件的优雅方法。

    【讨论】:

    • 是的..我知道卸载事件,但根据某些条件我需要阻止它被卸载......
    • 必须是用户控件吗?或者您是否可以使用在不满足某些条件时不会关闭的模态对话框?
    【解决方案3】:
    private void UserControl_Unloaded(object sender, RoutedEventArgs e)
    {
         if (ConditionsMet) { e.Handled = true; }
    }
    

    如果条件满足,则 Unloaded 事件将设置为 true,此后您的控件将保留在 VisualTree 中 - 您的控件不会卸载

    【讨论】:

    • 这在我的测试中不起作用。 e.Handled = true;似乎被忽略了。
    猜你喜欢
    • 2010-10-11
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多