【问题标题】:VB.NET overload default functionality when user clicks the X (Close Program)当用户单击 X(关闭程序)时,VB.NET 重载默认功能
【发布时间】:2009-10-13 20:45:30
【问题描述】:

当用户在基于 VB.NET 表单的应用程序中单击 X 时,如何覆盖默认功能?

我目前正在处理 MyBase.Closing 事件...但由于它是 DirectX 应用程序,我需要在允许表单关闭之前进行一些清理。

【问题讨论】:

  • 您能否详细说明一下为什么 Closing 事件在这种情况下不够好?
  • 我需要将程序关闭事件发布到我们的自定义事件管理器,以便应用程序可以以干净的方式关闭。许多事情需要展开或清理,例如任何未保存的数据或与服务器或其他客户端的连接。

标签: .net vb.net events event-handling overriding


【解决方案1】:

如果您想在表单关闭之前进行一些额外的清理,请在表单的Form Closing event 中执行此操作。

此事件还允许您通过事件的FormClosingEventArgs.Cancel property 取消表单关闭。事件的CloseReason 属性会告诉你事件被调用的原因(你会检查CloseReason.UserClosing

【讨论】:

  • 这不是此应用程序的选项。当用户单击 X 并且无法从 Closing Event 启动此清理时,我需要进行一些清理。我的问题与覆盖 X 按钮的功能有关。
  • 表单关闭事件触发时,表单不必关闭。你可以取消它。这不符合您的需求?
  • 那不符合我的需要
  • @Jay Riggs: -1*(-1) 表示聪明的双重否定答案:)
【解决方案2】:

你的其他 cmet;在事件触发之前做任何事情都为时过早;毕竟,其他一些代码可能会取消关闭,而您的表单将被破坏。就个人而言,我很想覆盖OnClosed;不是一个 VB 头,而是在 C# 中:

    protected override void OnClosing(CancelEventArgs e)
    {
        // check OK to close (save/cancel etc)
        base.OnClosing(e);
    }
    protected override void OnClosed(EventArgs e)
    {
        // your code here
        base.OnClosed(e);
        // or here
    }

【讨论】:

    【解决方案3】:

    如果您不愿意将代码放入 Form_Closing 事件中,我知道的唯一其他选项是我使用过一次或两次的“hack”。没有必要诉诸这种技巧,但这里是:


    不要使用正常的关闭按钮。相反,创建您的表单,使其没有 ControlBox。您可以通过在表单上设置 ControlBox = false 来做到这一点,在这种情况下,您仍然会有横跨表单顶部的普通栏,或者您可以将表单的 FormBorderStyle 设置为“无。如果您走第二条路线,那里顶部没有横条或任何其他可见边框,因此您必须通过在表单上绘图或通过艺术使用面板控件来模拟这些。

    然后您可以添加一个标准按钮并使其看起来像一个关闭按钮,然后将您的清理代码放入其中。在按钮事件结束时,只需调用this.Close()(C#)或Me.Close()(VB)

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多