【问题标题】:How can I hide form1 while Application.Run(form1) is executing?如何在 Application.Run(form1) 执行时隐藏 form1?
【发布时间】:2010-12-04 12:13:06
【问题描述】:


我有一个使用 Application.Run 运行的 form1。

我想隐藏这个表单(我需要隐藏它,因为我在后台运行了一些东西,所以它们必须执行)并打开另一个表单进行登录。

我尝试这样做的方法是在我的 form1 构造函数中执行命令this.Hide();,如果登录成功,则显示我的 form1,但它似乎不起作用。有什么想法吗?

【问题讨论】:

  • this.Hide() 为我工作,我们需要一个重现问题的代码示例...
  • 我不知道给你什么代码。它是在 Program.cs 中执行的标准 Application.Run(form),在表单的构造函数中有一个 this.Hide()
  • 您是否在 form1 的构造函数本身中执行您的后台内容(可能在调用 this.Hide() 之前?)
  • 我正在另一个线程中执行我的后台内容,该线程发送到我的 form1 数据。
  • C# Hide new Form at start 的可能重复项

标签: c# .net winforms forms


【解决方案1】:

只需重写 OnVisibleChanged 方法并在其中更改表单的可见性,如下所示:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);
    this.Visible = false;
}

就是这样!简单干净。

【讨论】:

  • 我现在正在使用它,它运行良好,但是如果我想打开它却找不到正在运行的应用程序?当我使用你的方法时,我看到它在任务管理器中运行。但找不到它在哪里运行..
【解决方案2】:

您可以在 Form1 类中覆盖 SetVisibleCore,以便在启动时隐藏 Form1 实例。所以这里是一个隐藏和保持表单隐藏的例子,当然你应该添加一些逻辑来决定何时应该允许表单真正可见。

public partial class Form1 : Form 
{ 
  public Form1() 
  { 
    InitializeComponent(); 
  } 

  protected override void SetVisibleCore(bool value) 
  {       
    // Quick and dirty to keep the main window invisible
    // you can put some logic here to decide when to use the
    // incomming value and when to force it to be false as I 
    // am showing here.       
    base.SetVisibleCore(false); 
  } 
} 

这是一个简单的例子,虽然是人为的。 Form1 开始不可见并显示 Form2,当 Form2 关闭时,它允许 Form1 变为可见并显示窗体。

using System;
using System.Windows.Forms;

namespace HideMainWinForm
{
  public partial class Form1 : Form
  {
    // Initially the main form cannot show
    private bool _canShow = false; 

    public Form1()
    {
      InitializeComponent();

      Form2 frm = new Form2();
      frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
      frm.Show();      
    }

    void frm_FormClosed(object sender, FormClosedEventArgs e)
    {
      // Once Form2 is closed we now allow the main form to
      // become visible.
      _canShow = true;
      this.Show();
    }

    protected override void SetVisibleCore(bool value)
    {
      base.SetVisibleCore(_canShow && value);
    }
  }
}

【讨论】:

  • @Badescu Alexandru,是什么不起作用?表格没有隐藏吗?您能分享一下您是如何尝试的吗?
  • public Form1(){ InitializeComponent(); SetVisibleCore(假);登录 li = 新登录(此); li.Show(); }
  • 我已经使用了你的函数,除了 base.SetVisibleCore(false) 中的“false”我已经包含了 bool“value”
  • @Badescu Alexandru,你不应该调用 SetVisibleCore,框架会调用它。您只在函数中提供可见性逻辑。请参阅我的简单更新示例。
  • 如果您在新的测试应用程序中使用第二个示例中的代码,是否符合您的预期?
【解决方案3】:

看到这个:Use the ApplicationContext Class to Fully Encapsulate Splash Screen Functionality

它基本上讨论了如何首先显示启动表单,然后在完成加载后,如何调用主表单。 (如果您在后台执行某些操作时隐藏主窗体,请考虑使用闪屏)

引言:这不是关于如何创建的示例 您的应用程序的启动画面。这 文章解释了一种干净的方法 封装启动画面 继承的功能 应用上下文类。本文 还详细显示了发生的情况 WinForm 应用程序在幕后 开始。

【讨论】:

    【解决方案4】:

    如果您需要在显示表单之前做一些后台工作,我会建议两种可能的选择。

    第一个,是在创建表单并在其上调用Application.Run 之前简单地做你的后台工作。

    如果您需要在执行后台工作时激活消息循环,则第二个选项是使用不采用 From 作为参数的Application.Run 重载,然后在您执行时准确显示您的表单想要。唯一需要注意的是,当您想要结束应用程序时,您必须手动调用 Application.ExitApplication.ExitThread(因为它没有可以观察其 Close 事件的 Form)。

    所以你的代码可能看起来像这样:

    void Main()
    {
        // trigger some background work
        ...
    
        // and start the message pump
        Application.Run();
    }
    
    
    void SomeBackgroundWork()
    {
        // let's say now you completed the background work and you want to show your main Form
        MyForm f = new MyForm();
        f.Close += delegate { Application.Exit(); };
        f.Show();
    }
    

    如果需要澄清,请发表评论...

    【讨论】:

    • 问题是我从一个线程向我的表单发送数据,所以我永远无法退出它,所以第一个选项出现故障(因为有一个连续的流,所以我的程序接收数据非常频繁,第二个选项不是有效的,因为我将要求表单多次进入“隐藏模式”,因为用户可以根据需要多次登录和注销..并关闭应用程序并重新启动这不是一个选择
    【解决方案5】:

    问题如下:

    通过在构造函数中调用this.Hide(),您实际上设置了this.Visible = false,但在表单实例化之后立即调用form.Show(由Application.Run)并且form.Show在内部设置this.Visible = true(嗯,当然与隐藏相反...)。

    你可以这样做:

    private bool firstShow = true;
    
    protected override void OnShown(EventArgs e)
    {
        if (firstShow)
        {
            this.Hide();
            firstShow = false;
            return;
        }
        base.OnShown(e);
    }
    

    表格会出现片刻,然后立即消失。

    布尔标志 firstShow 允许您仅在第一次调用 Show() 时隐藏表单,而对于以下调用,它将照常工作。

    【讨论】:

      【解决方案6】:

      Windows 窗体有一个非常适合这种情况的事件,称为Form.Shown。当 Form 首次显示时,每个 Form 对象只调用一次。基本上是 digEmAll 的答案,但已经内置了。

      将事件处理程序添加到由Form1.Shown 调用的构造函数,然后在名为Hide() 的处理程序中

      public form1()
      {
          InitializeComponent()
          this.Shown += new EventHandler(form1_Shown);
          // call splash page
      }
      
      void form1_Shown(object sender, EventArgs e)
      {
          this.Hide()
      }
      

      【讨论】:

        【解决方案7】:

        您可以使用这种方式。但是,您必须注意使用 await 和 async 的方法。

        protected override void OnVisibleChanged(EventArgs e){
            base.OnVisibleChanged(e);
            this.Visible = false;
        }
        

        使用(await 和 async)的方法在表单初始化中必须有(result)这个词。

        例子:

        public frmForm1() {
            InitializeComponent();
            try {
                if (Program.LaunchedViaStartup == true) {
                    var varclsReturnBack = funcStartBackGroundObjectsAsync().Result;
                }
            } catch (Exception varException) {
                Console.Write(varException.Message);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多