【问题标题】:How to have an invisible start up form?如何拥有一个看不见的启动表格?
【发布时间】:2012-09-05 19:12:34
【问题描述】:

我有一个应用程序是项目解决方案的一部分。在这个项目中,我希望它启动表单是不可见的,但在此表单可见的托盘中仍然有一个通知图标。

我知道将me.hide 添加到form_load 不起作用。我尝试添加一个实例化启动表单的模块,并将其设置为启动对象。虽然那也没用。我已经没有想法让这种形式不可见了。有人可以帮忙吗?我正在使用 VB.NET。

【问题讨论】:

    标签: vb.net winforms visual-studio-2010


    【解决方案1】:

    把它放在表单的 Shown 事件中

    Me.Visible = False
    

    【讨论】:

    • 这非常适合我的目的,因为我在启动时启动的许多其他东西不适用于公认的解决方案。
    【解决方案2】:

    将此粘贴​​到您的表单代码中:

    Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
        If Not Me.IsHandleCreated Then
            Me.CreateHandle()
            value = False
        End If
        MyBase.SetVisibleCore(value)
    End Sub
    

    工作方式是显示表单的第一个请求,由 Application 类完成,此代码将 Visible 属性覆盖回 False。此后表单将正常运行,您可以调用 Show() 使其可见,并调用 Close() 将其关闭,即使它从不可见。请注意,Load 事件在您显示之前不会触发,因此请务必将事件处理程序中的任何代码(如果有)移动到构造函数或此覆盖。

    【讨论】:

    • 谢谢它的工作。我有一个问题。我在我的项目上设置了一个启动画面,现在由于主窗体没有像往常一样“加载”,它不会关闭启动画面。我认为解决方法是将 splashscreen.close() 添加到主要表单覆盖中。虽然我得到一个非法的跨线程错误。可以将其中的非法跨线程调用检查设置为 false 吗?还是有更好的办法?
    • 呃。当主窗体的 Load 事件触发时,初始屏幕会关闭。正如我所记录的,直到您调用 Show() 才会发生这种情况。你不能两全其美。只有在程序启动延迟时才使用启动画面。
    • 这是一次完美的问答。我遇到了同样的问题,这完全符合我的要求。现在表单甚至在几毫秒内都没有显示。谢谢。
    • 还有一个很好的答案here,可以通过调用sub main()在启动时管理vb.net应用程序表单和上下文。
    • 很好的解决方案。对我最有效。所有不透明度、隐藏、最小化选项都导致操作前短暂闪烁。这确保了根本没有可见性。您只需要注意 mybase.load 下的内容,可能是子它 + 从上面覆盖调用。其他选项是覆盖中的 me.show()。
    【解决方案3】:

    只是为了抛弃一种完全不同的方法,您是否考虑过使用Application.Run() 的重载来获取(并自动显示)Form?如果您使用传入ApplicationContext 的那个(或者更确切地说,是您自己的ApplicationContext 子类),那么您可以选择您的行为。有关详细信息,请参见此处:

    http://msdn.microsoft.com/en-us/library/ms157901

    【讨论】:

    • 如果是我,我根本不会在启动时创建表单。您的自定义 ApplicationContext 可以很好地创建和侦听来自托盘通知组件的事件。那么你只需要在需要的时候创建一个表单。
    【解决方案4】:

    最简单的方法是将表单的不透明度设置为 0%。当您希望它出现时,将其设置回 100%

    【讨论】:

    • 这解决了我的问题。在Shown 事件中调用Me.Visible=false 会导致显示看起来很奇怪。谢谢。
    【解决方案5】:

    使用Me.Opacity = 0 隐藏表单加载事件。

    然后在form.Shown事件中使用如下代码

    Me.Hide()
    Me.Opacity = 100
    

    【讨论】:

      【解决方案6】:

      这是我发现的另一种方法。

      使用

      设置表单属性
      ShowInTaskbar = False
      

      然后在表单的构造函数中添加

      WindowState = FormWindowState.Minimized
      

      这很容易实现并且没有闪烁。在我的情况下,我还使用 NotifyIcon 从通知托盘访问程序并设置

      WindowState = FormWindowState.Normal
      Show()
      BringToFront()
      

      在 Notify_MouseClick 事件处理程序中。

      要在显示后再次隐藏表单,再次最小化并不能完全完成这项工作。在我的情况下,我使用 Form_Closing 事件并隐藏表单。

      Hide()
      

      【讨论】:

        【解决方案7】:

        试试这个:

        Sub New()
            MyBase.SetVisibleCore(False)
        End Sub
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多