2009-07-15 2 views
1

Я смущен о том, как сделать видимую форму. Когда мы создаем приложение Windows Forms, форма Form1 по умолчанию автоматически отображается, даже без явного вызова метода Show. Но если мы хотим показать другую форму и сделать ее видимой, мы должны сделать ее видимой, вызвав Show.Проблема видимости Windows Forms

Любые идеи, почему существуют такие различия?

Я использую VSTS 2008 + C# + .Net 2.0.

ответ

2

Это потому, что форма Form1 будет основной формой приложения. В частности, он будет передан методу Application.Run, который создаст объект ApplicationContext с Form1, назначенным в качестве основной формы. Когда приложение запускается, оно проверяет, имеет ли форма ApplicationContext основная форма, и если это так, то свойство Visible этой формы будет установлено в true, что приведет к отображению формы.

Или, выраженное в коде, это Application.Run:

public static void Run(Form mainForm) 
{ 
    ThreadContext.FromCurrent().RunMessageLoop(-1, new ApplicationContext(mainForm)); 
} 

RunMessageLoop будет вызывать другую внутреннюю функцию, чтобы настроить цикл обработки сообщений, и в этой функции мы находим следующее:

if (this.applicationContext.MainForm != null) 
{ 
    this.applicationContext.MainForm.Visible = true; 
} 

Именно это и показывает Form1.

Это также дает подсказку о том, как действовать, чтобы форма Form1 автоматически отображалась при запуске. Все, что нам нужно сделать, это найти способ для запуска приложения без необходимости Form1 назначен в качестве основной формы в ApplicationContext:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    // create the form, but don't show it 
    Form1 form = new Form1(); 
    // create an application context, without a main form 
    ApplicationContext context = new ApplicationContext(); 
    // run the application 
    Application.Run(context); 
} 
+0

Спасибо Fredrik, где вы находите блок кода if, который вы опубликовали? – George2

+1

Я использовал рефлектор Red Gate: http://www.red-gate.com/products/reflector/ –

+0

Прохладный, в чем разница между Show и Set Visible to true? – George2

4

Посмотрите на файл «Program.cs», который генерирует VS для вас.

static class Program { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); // and especially this line :) 
    } 
} 
+0

Привет Stormenet, я не нашел Show вызывается из кода, который вы привели. Есть еще намеки? – George2

+0

Application.Run вызовет Show для вас. В основном, эта строка сообщает, что исходной формой для вашего приложения является Form1. Если вы хотите показать другую форму запуска, просто измените эту строку. – Stormenet

1

потому что форма1 является основной формой, называемой Application.Run (new form1());

вы найдете этот код в файле program.cs, и вы можете изменить его в любой форме.

+0

Ахмед, если я новичок в другой форме и построю его, используя Form2 form2 = new Form2(), form2 никогда не показывает. Я думаю, что код такой же, как то, что VSTS генерирует для меня в Program.cs, и я не знаю, почему Form2 не показывает? – George2