ロードイベント中にフォームの可視性を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;
}
}
}
フォームが表示される前に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インスタンスを指定したりする必要はないようです(これは「内部」で自動的に作成されます)。それに応じてコードを短くしました。
これが古い質問であることは知っていますが、私はそれを偶然見つけただけで、誰も言及していないことにかなり驚いています SetVisibleCore
:
bool isVisibleCore = false;
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(isVisibleCore);
}
そのコードスニペットでは、isVisibleCore
がfalseのままである限り、フォームは非表示のままになります。フォームがインスタンス化されたときにfalseに設定されている場合、ShownイベントでVisible = false
を設定した場合に得られるような、短時間の可視性は得られません。
適切に機能するソリューションを見つけるのに少し時間がかかりました。
プロパティウィンドウで、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でテストされています
フォームが作成され、作成時に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();
):
Form1
のインスタンスを作成するだけで、それを表示/表示するメソッドを呼び出さないでください。しかし、私はあなたが何か間違ったことをしているに違いない。
デザインでOpacityプロパティを0に設定し、フォームを表示するときに100に戻すのはどうですか?
VisibleChangedイベントを試してください。
私が提案するのは、IntializeComponent()呼び出しの後で、コンストラクターなどの_Showイベントの前にあるイベントでフォームをインスタンス化することです。
示されているイベントはあなたが望むものを与えるかもしれません。フォームは非表示になる前に1秒間「点滅」しますが。
private void Form1_Shown(object sender, EventArgs e)
{
this.Visible = false;
}
これがあなたのメインフォームである場合、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;
}
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();
}
}
やってみました
this.Hide();
の中に form_load
またはform_activated
イベント
フォームに次の3つのプロパティ設定を設定します。
ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
Initの後にコンストラクターの可視性を設定し、後でthis.Show()を設定します
InitializeComponent()はthis.Visible = trueを設定しています。これは、フォームがデザイナに表示されるように指定したためです(またはデフォルトで設定されています)。デザイナでVisibleをfalseに設定する必要があります。そうしないと、InitializeComponent()によって呼び出されません。その後、いつでも表示できます。
Load
イベントに_.Visible = false
_またはHide()
を含めると、フォームが物理的に表示されてからLoad
イベントが発生するまでの間に時間がかかるため、フォームが短時間表示されます。ドキュメントには反対のことが書かれています。
どこかでShow()
またはShowDialog()
に電話していますか?この動作がまだ存在するかどうかはわかりませんが、少なくとも過去のバージョンのフレームワークでは、ShowDialog()
を呼び出してもLoad
イベントがトリガーされなかったため、おそらくそれが問題です(ShowDialog()
次に、モーダルフォームを非表示にするのは悪い習慣です!)
何をしようとしてもハンドル(およびコントロールのハンドル)を作成する必要がある場合は、StartLocation
をManual
に設定してから、Position
プロパティを画面外の場所に設定することをお勧めします。これにより、フォームが作成および表示され、ユーザーには表示されなくなります。
ええ、アプリケーションのビジュアルよりもコードの観点から見た本当にエレガントな方法の1つは、コンストラクター/ロードイベントに隠れてフォームをちらつくことです。