it-swarm-ru.tech

Одиночная форма Скрыть при запуске

У меня есть приложение с одной формой, и в методе Load мне нужно скрыть форму.

Форма будет отображаться сама собой, когда в этом есть необходимость (подумайте в стиле всплывающего окна в стиле Outlook 2003), но я не могу понять, как скрыть форму при загрузке без каких-либо проблем.

Какие-либо предложения?

71
Pondidum

Я иду на это из C #, но должно быть очень похоже на vb.net.

В вашем основном программном файле, в методе Main, у вас будет что-то вроде:

Application.Run(new MainForm());

Это создает новую основную форму и ограничивает время жизни приложения временем жизни основной формы.

Однако, если вы удалите параметр для Application.Run (), приложение будет запущено без отображения формы, и вы сможете свободно показывать и скрывать формы сколько угодно.

Вместо того, чтобы скрывать форму в методе Load, инициализируйте форму перед вызовом Application.Run (). Я предполагаю, что форма будет иметь NotifyIcon для отображения значка на панели задач - это можно отобразить, даже если сама форма еще не видна. Вызов Form.Show() или Form.Hide() из обработчиков событий NotifyIcon будет показывать и скрывать форму соответственно.

107
Grokys

Обычно вы делаете это только тогда, когда используете значок в трее или какой-либо другой метод для отображения формы позже, но это будет хорошо работать, даже если вы никогда не отображаете основную форму.

Создайте bool в вашем классе Form, который по умолчанию равен false:

private bool allowshowdisplay = false;

Затем переопределите метод SetVisibleCore

protected override void SetVisibleCore(bool value)
{            
    base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay);
}

Поскольку Application.Run () устанавливает формы .Visible = true после загрузки формы, это будет перехватывать это значение и устанавливать значение false. В приведенном выше случае он всегда будет устанавливать значение false, пока вы не включите его, установив для параметра allowhowdisplay значение true.

Теперь это будет препятствовать отображению формы при запуске, теперь вам нужно снова включить SetVisibleCore для правильной работы, установив allowhowdisplay = true. Вы захотите сделать это в любой функции пользовательского интерфейса, которая отображает форму. В моем примере это событие левого клика в моем объекте notiyicon:

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        this.allowshowdisplay = true;
        this.Visible = !this.Visible;                
    }
}
92
Paul Aicher

Я использую это:

private void MainForm_Load(object sender, EventArgs e)
{
    if (Settings.Instance.HideAtStartup)
    {
        BeginInvoke(new MethodInvoker(delegate
        {
            Hide();
        }));
    }
}

Очевидно, вы должны изменить условие if на ваше.

33
Matías
    protected override void OnLoad(EventArgs e)
    {
        Visible = false; // Hide form window.
        ShowInTaskbar = false; // Remove from taskbar.
        Opacity = 0;

        base.OnLoad(e);
    }
18
Chriz

Во время создания формы (конструктор, программа Main или конструктор форм, в зависимости от ваших целей),

 this.WindowState = FormWindowState.Minimized;
 this.ShowInTaskbar = false;

Когда вам нужно показать форму, предположительно по событию из вашего NotifyIcon, при необходимости измените ее,

 if (!this.ShowInTaskbar)
    this.ShowInTaskbar = true;

 if (this.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;

Последовательные события show/hide могут проще использовать свойство Visible формы или методы Show/Hide.

14
Jeff

Попробуйте также скрыть приложение от панели задач.

Для этого используйте этот код.

  protected override void OnLoad(EventArgs e)
  {
   Visible = false; // Hide form window.
   ShowInTaskbar = false; // Remove from taskbar.
   Opacity = 0;

   base.OnLoad(e);
   }

Благодарю. Рухул

5
Metallic Skeleton

Я много боролся с этой проблемой, и решение намного проще, чем я. Сначала я попробовал все предложения здесь, но потом я не был удовлетворен результатом и исследовал его немного больше. Я обнаружил, что если я добавлю:

 this.visible=false;
 /* to the InitializeComponent() code just before the */
 this.Load += new System.EventHandler(this.DebugOnOff_Load);

Работает просто отлично. но я хотел более простое решение, и оказалось, что если вы добавите:

this.visible=false;
/* to the start of the load event, you get a
simple perfect working solution :) */ 
private void
DebugOnOff_Load(object sender, EventArgs e)
{
this.Visible = false;
}
3
echoen

Вы захотите установить минимизированное состояние окна и показать на панели задач значение false. Затем в конце вашей формы Загрузить установить состояние окна на максимальный и показать на панели задач в true

    public frmMain()
    {
        Program.MainForm = this;
        InitializeComponent();

        this.WindowState = FormWindowState.Minimized;
        this.ShowInTaskbar = false;
    }

private void frmMain_Load(object sender, EventArgs e)
    {
        //Do heavy things here

        //At the end do this
        this.WindowState = FormWindowState.Maximized;
        this.ShowInTaskbar = true;
    }
3
George

Поместите это в свой Program.cs:

FormName FormName = new FormName ();

FormName.ShowInTaskbar = false;
FormName.Opacity = 0;
FormName.Show();
FormName.Hide();

Используйте это, когда вы хотите отобразить форму:

var principalForm = Application.OpenForms.OfType<FormName>().Single();
principalForm.ShowInTaskbar = true;
principalForm.Opacity = 100;
principalForm.Show();
3
Ben Yousaf

Переопределить OnVisibleChanged в форме

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

    base.OnVisibleChanged(e);
}

Вы можете добавить триггер, если вам может понадобиться показать его в какой-то момент

public partial class MainForm : Form
{
public bool hideForm = true;
...
public MainForm (bool hideForm)
    {
        this.hideForm = hideForm;
        InitializeComponent();
    }
...
protected override void OnVisibleChanged(EventArgs e)
    {
        if (this.hideForm)
            this.Visible = false;

        base.OnVisibleChanged(e);
    }
...
}
1
LKane

Это прекрасно работает для меня:

[STAThread]
    static void Main()
    {
        try
        {
            frmBase frm = new frmBase();               
            Application.Run();
        }

Когда я запускал проект, все было скрыто, в том числе на панели задач, если мне не нужно показывать его ..

0
Willy David Jr

Запуск приложения без формы означает, что вам придется самостоятельно управлять запуском/закрытием приложения.

Лучше всего начинать с невидимой формы.

0
Roger Willcocks
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    MainUIForm mainUiForm = new MainUIForm();
    mainUiForm.Visible = false;
    Application.Run();
}
0
kilsek

Вот простой подход:
Это на C # (на данный момент у меня нет компилятора VB)

public Form1()
{
    InitializeComponent();
    Hide(); // Also Visible = false can be used
}

private void Form1_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
    Show(); // Or visible = true;
}
0
aku
    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form1 = new Form1();
            form1.Visible = false;
            Application.Run();

        }
 private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
            Application.Exit();
        }
0
Muhammad Rashed Nadeem

У меня была проблема, похожая на постер, где код для скрытия формы в событии form_Load срабатывал до того, как форма была полностью загружена, что приводило к сбою метода Hide () (без сбоев, просто не работал должным образом).

Другие ответы хороши и работают, но я обнаружил, что в общем случае событие form_Load часто имеет такие проблемы, и то, что вы хотите поместить туда, может быть легко добавлено в конструктор или событие form_Shown.

В любом случае, когда я переместил тот же код, который проверяет некоторые вещи, а затем скрывает форму, когда она не нужна (форма входа в систему при сбое единого входа), она работала, как и ожидалось.

0
blind Skwirl

В этом примере поддерживается полная невидимость, а также только NotifyIcon в системном трее, нет кликов и многое другое.

Подробнее здесь: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

В качестве дополнения к ответ Groky (что на самом деле является лучшим ответом на мой взгляд), мы могли бы также упомянуть класс ApplicationContext , который также позволяет (как это показано в Пример статьи) возможность открывать две (или даже больше) формы при запуске приложения и контролировать время жизни приложения со всеми из них.

0
Eugenio Miró