web-dev-qa-db-ja.com

C#/。NET-WinForms-フォームを表示せずにインスタンス化する

ロードイベント中にフォームの可視性をfalseに変更していますが、フォームは引き続き表示されます。これを結び付ける正しいイベントは何ですか。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;
        }

    }
}
22
BuddyJoe

フォームが表示される前に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インスタンスを指定したりする必要はないようです(これは「内部」で自動的に作成されます)。それに応じてコードを短くしました。

24
Fredrik Mörk

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

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

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

11
Nick Spreitzer

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

プロパティウィンドウで、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 ExpressEditionでテストされています

10
Jose Cherian

フォームが作成され、作成時に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(); 

):

2
Shimon Doodkin

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

2
Anton Gogolev

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

2
Jules00

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

1
David Suarez

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

1

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

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

これがあなたのメインフォームである場合、Shownイベントよりも良い場所はないかもしれません。ただし、その場合はちらつきが発生します。

実行中のメインフォームが少なくともすぐに表示されないようにするのに適した場所を見つけることができませんでした。ロードイベントでアクティブ化されたタイマーでさえ、それを行いません。

セカンダリフォームの場合は、作成するだけで表示しないでください。

1
automatic

ちらつきのない表示ソリューションの場合は、読み込み中にフォームの場所を画面外に設定します。

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;
}
1
Reg Edit

Winformは通常、多数のコントロールを初期化したり、大きな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();      
    }
}
0
IVSoftware

やってみました

this.Hide();

の中に form_loadまたはform_activatedイベント

0
Eoin Campbell

フォームに次の3つのプロパティ設定を設定します。

ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
0
Randal Hicks

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

0
Chad Grant

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

0
Matthew Olenik

Loadイベントに_.Visible = false_またはHide()を含めると、フォームが物理的に表示されてからLoadイベントが発生するまでの間に時間がかかるため、フォームが短時間表示されます。ドキュメントには反対のことが書かれています。

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

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

0
Adam Robinson

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

0
chaz