23

load イベント中に Form の Visibility を false に変更していますが、フォームはまだ表示されています。this.Visible = false; を結び付ける正しいイベントは何ですか? に?Form1 を表示せずにインスタンス化したいと思います。

using System;
using System.Windows.Forms;

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

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Visible = false;
        }

    }
}
4

18 に答える 18

24

フォームが表示される前に Visible プロパティをどれだけ設定しようとしても、フォームがポップアップします。私が理解しているように、これは現在の ApplicationContext の MainForm であるためです。フォームを自動的に読み込み、アプリケーションの起動時に表示しないようにする 1 つの方法は、Main メソッドを変更することです。デフォルトでは、次のようになります (.NET 2.0 VS2005):

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

代わりにこのようなことをすると、アプリケーションが起動し、フォームをロードして実行しますが、フォームは表示されません:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form1 f = new Form1();
    Application.Run();        

}

これがどのように役立つかは完全にはわかりませんが、それを知っていただければ幸いです;o)

更新: Visible プロパティを false に設定したり、ApplicationContext インスタンスを提供したりする必要はないようです (「フードの下で」自動的に作成されます)。それに応じてコードを短くしました。

于 2009-04-30T14:02:44.637 に答える
11

これは古い質問であることは知っていますが、偶然見つけたばかりで、誰も言及していないことにかなり驚いていSetVisibleCoreます。

bool isVisibleCore = false;
protected override void SetVisibleCore(bool value)
{
    base.SetVisibleCore(isVisibleCore);
}

isVisibleCoreそのコード スニペットでは、 false のままである限り、フォームは非表示のままになります。Visible = falseフォームがインスタンス化されるときに false に設定されている場合、Shown イベントで設定した場合に得られる可視性の短い閃光は得られません。

于 2012-07-28T19:10:57.983 に答える
10

適切に機能するソリューションを見つけるのに時間がかかりました。

プロパティ ウィンドウで、WindowState という名前のプロパティを Minimized に、ShowInTaskbar を False に設定します。フォームが完全に読み込まれたら、以下のコード行を呼び出します。

        this.ShowInTaskbar = true;
        this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        //this.WindowState = System.Windows.Forms.FormWindowState.Normal;

PS: このソリューションは、Visual C# 2008 Express Edition でテスト済みです。

于 2012-02-08T07:35:13.620 に答える
2

ちらつきのない Shown ソリューションの場合、ロード中にフォームの場所を画面外に設定することもできます。

private Point startuplocation;

private void Form1_Load(object sender, EventArgs e)
{
    this.startuplocation = this.Location;
    this.Location = new Point(-1000, -1000);
}

private void Form1_Shown(object sender, EventArgs e) //fires first time shown
{
    this.Visible = false;
    this.Location = this.startuplocation;
}
于 2015-10-04T00:06:16.127 に答える
2

フォームが作成され、作成時に on_load が呼び出されるように、私は一緒に暮らすことができるソリューションです。WindowState を最小化するように設定し、読み込み時に表示を false に設定し、windowstate を通常に設定します

private void Form1_Load(object sender, EventArgs e)
{
        this.Visible = false;
        this.WindowState = FormWindowState.Normal;
}

うまくいかなかったもの:

SetVisibleCore オーバーライド ソリューションはフォームを作成しませんでした

また、

Application {
 Form1 f = new Form1();
 Application.Run(); 

):

于 2013-01-21T10:30:35.400 に答える
2

設計時に Opacity プロパティを 0 に設定し、フォームを表示するときに 100 に戻すのはどうですか?

于 2012-12-08T23:51:25.363 に答える
1

のインスタンスを作成するだけでForm1、それを表示/表示するメソッドを呼び出さないでください。しかし、私はあなたが何か間違ったことをしているに違いない。

于 2009-04-30T13:51:04.803 に答える
1

VisibleChanged イベントを試してください。

于 2009-04-30T13:51:41.340 に答える
1

私が提案するのは、IntializeComponent() 呼び出しの後に、コンストラクターなどの _Show イベントに先行するイベントでフォームをインスタンス化することです。

于 2009-04-30T13:52:07.407 に答える
1

示されているイベントは、あなたが望むものを与えるかもしれません。ただし、フォームは非表示になる前に 1 秒間「点滅」します。

private void Form1_Shown(object sender, EventArgs e)
    {
        this.Visible = false;
    }
于 2009-04-30T13:56:53.480 に答える
1

これがメイン フォームである場合、Shown イベントよりも適切な場所はない可能性があります。しかし、その場合、ちらつきが発生します。

実行中のメイン フォームが表示されないようにする適切な場所が見つかりませんでした。load イベントでアクティブ化されたタイマーでさえ、それを行いません。

セカンダリ フォームの場合は、作成するだけで表示しません。

于 2009-04-30T14:06:55.717 に答える
0

ええ、アプリケーションのビジュアルよりもコードの観点から見た本当にエレガントな方法の1つは、コンストラクター/ロードイベントに隠れてフォームをちらつかせることです。

于 2011-11-23T15:05:57.777 に答える
0

ドキュメンテーションには反対のことが書かれているにもかかわらず、イベントが物理的に表示されるようになってからイベントが発生するまでの間に時間がかかるため、.Visible = falseイベントを使用すると、フォームが短時間表示されます。Hide()LoadLoad

あなたはどこかShow()に電話していますか?ShowDialog()この動作がまだ存在するかどうかはわかりませんが、少なくともフレームワークの過去のバージョンでは、 への呼び出しがイベントをShowDialog()トリガーしなかったため、おそらくそれが問題です (モーダル フォームをLoad呼び出してから非表示にするのは悪いことだと思いますが)。ShowDialog()練習!)

何をしようとしてもハンドル (およびコントロールのハンドル) を作成する必要がある場合は、 を に設定してから、プロパティを画面外の場所に設定することをお勧めStartLocationManualますPosition。これにより、フォームが作成されて表示されますが、ユーザーには表示されません。

于 2009-04-30T14:01:31.610 に答える
0

やってみました

this.Hide();

form_loadまたはform_activatedイベントで

于 2009-04-30T13:51:27.063 に答える
0

コンストラクターの可視性を init の後に設定し、次に this.Show() を後で設定します

于 2009-04-30T13:56:39.300 に答える
0

InitializeComponent() は this.Visible = true を設定しています。これは、フォームがデザイナーで表示されるように指定したためです (またはデフォルトで表示されます)。デザイナーで Visible を false に設定する必要があり、InitializeComponent() によって呼び出されません。その後、いつでも表示できるようになります。

于 2009-04-30T13:58:58.450 に答える
0

Winforms は通常、一連のコントロールを初期化したり、大きな DataGridView を設定したりしている間は見栄えがよくないため、これは本当に腹立たしいことに同意します。それでも、それを行う前にウィンドウハンドルが存在する必要があり、言及されているすべての問題を作成します。

これは私にとってうまくいったもので、2 つの選択肢があります。準備が整うまでメイン フォームを非表示にするか、何らかの小さなスプラッシュ スクリーンを表示して、作業中であることをユーザーに知らせることができます。楽しみ。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }
    Size mDeferredSize;
    protected override void OnHandleCreated(EventArgs e)
    {
        // Capture the "real" size...
        mDeferredSize = Size;
        // and set it to nothing...
        Size = new Size(0, 0);
        DoSomeUglyInitialization(showOptionalSplash: true);
        Size = mDeferredSize; // ...and now put it back to the original size    
        base.OnHandleCreated(e);
    }
    private void DoSomeUglyInitialization(bool showOptionalSplash)
    {
        MySplash splash = null; 
        if (showOptionalSplash)
        {
            // We have made some borderless form class with a logo or something...
            splash = new MySplash(); 
            splash.Show();
        }
        // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        // Initialization that REQUIRES A HANDLE, e,g,
        // we might be creating a bunch of controls, or 
        // populating a big DataGridView. Whatever it is,
        // we don't want everyone looking at our biz.
        System.Threading.Thread.Sleep(2500); // (Here simulated...)
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        splash?.Dispose();      
    }
}
于 2018-03-06T01:33:03.367 に答える