Одна форма скрыть при запуске
У меня есть приложение с одной формой, и на способ загрузки мне нужно скрыть форму.
форма будет отображаться, когда у нее есть необходимость (подумайте о всплывающем окне стиля outlook 2003), но я могу понять, как скрыть форму при загрузке без чего-то грязного.
какие предложения?
20 ответов:
Я иду на это из C#, но должен быть очень похож на vb.net.
в вашем основном файле программы, в основном методе, вы будете иметь что-то вроде:
Application.Run(new MainForm());это создает новую основную форму и ограничивает время жизни приложения до времени жизни основной формы.
однако, если вы удалите параметр в приложение.Run (), то приложение будет запущено без формы показано, и вы будете свободны, чтобы показать и скрыть формы столько, сколько вы как.
вместо того, чтобы скрывать форму в методе Load, инициализируйте форму перед вызовом приложения.Работать.)( Я предполагаю, что форма будет иметь NotifyIcon на нем, чтобы отобразить значок в панели задач - это может быть отображается, даже если сама форма еще не видна. Звоню
Form.Show()илиForm.Hide()из обработчиков событий NotifyIcon будет показывать и скрывать форму соответственно.
обычно вы делаете это только тогда, когда используете значок в трее или какой-либо другой метод для отображения формы позже, но он будет работать хорошо, даже если вы никогда не отображаете свою основную форму.
создайте bool в своем классе формы, который по умолчанию имеет значение false:
private bool allowshowdisplay = false;затем переопределите метод SetVisibleCore
protected override void SetVisibleCore(bool value) { base.SetVisibleCore(allowshowdisplay ? value : allowshowdisplay); }Потому Что Приложение.Выполнить() наборы форм .Видны = True после того, как он загружает форму, это будет перехватывать, что и присвойте ему значение false. В выше case, он всегда будет устанавливать его в false, пока вы не включите его, установив allowshowdisplay в true.
Теперь, когда форма не будет отображаться при запуске, теперь вам нужно повторно включить SetVisibleCore для правильной работы, установив allowshowdisplay = 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; } }
Я использую этот:
private void MainForm_Load(object sender, EventArgs e) { if (Settings.Instance.HideAtStartup) { BeginInvoke(new MethodInvoker(delegate { Hide(); })); } }очевидно,что вы должны изменить условие if с вашим.
protected override void OnLoad(EventArgs e) { Visible = false; // Hide form window. ShowInTaskbar = false; // Remove from taskbar. Opacity = 0; base.OnLoad(e); }
во время построения формы (конструктор, программа 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.
расширьте свою основную форму с помощью этого:
using System.Windows.Forms; namespace HideWindows { public class HideForm : Form { public HideForm() { Opacity = 0; ShowInTaskbar = false; } public new void Show() { Opacity = 100; ShowInTaskbar = true; Show(this); } } }например:
namespace HideWindows { public partial class Form1 : HideForm { public Form1() { InitializeComponent(); } } }дополнительная информация в этой статье (испанский):
пытаются скрыть приложение из панели задач, а также.
для этого, пожалуйста, используйте этот код.
protected override void OnLoad(EventArgs e) { Visible = false; // Hide form window. ShowInTaskbar = false; // Remove from taskbar. Opacity = 0; base.OnLoad(e); }спасибо. Ruhul
Я много боролся с этой проблемой, и решение намного проще, чем я, хотя. Я сначала попробовал все предложения здесь, но потом я не был удовлетворен результатом и исследовал его немного больше. Я обнаружил, что если я добавлю:
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; }
вы хотите установить состояние окна в свернутом виде и показать на панели задач значение 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; }
в конструкторе установите для свойства Visible формы значение false. Затем избегайте вызова Show (), пока он вам не понадобится.
лучшая парадигма заключается в том, чтобы не создавать экземпляр формы, пока он вам не понадобится.
вот простой подход:
Это в 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; }
запуск приложения без формы означает, что вам придется самостоятельно управлять запуском/выключением приложения.
запуск формы с невидимым является лучшим вариантом.
этот пример поддерживает полную невидимость, а также только NotifyIcon в системном трее и без кликов и многое другое.
подробнее здесь:http://code.msdn.microsoft.com/TheNotifyIconExample
в дополнение к Groky это (что на самом деле является лучшим ответом на мой взгляд) мы могли бы также упомянуть ApplicationContext класс, который также позволяет (как показано в примере статьи) открывать две (или даже более) формы при запуске приложения и управлять временем жизни приложения со всеми из них.
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MainUIForm mainUiForm = new MainUIForm(); mainUiForm.Visible = false; Application.Run(); }
Это прекрасно работает для меня:
[STAThread] static void Main() { try { frmBase frm = new frmBase(); Application.Run(); }когда я запускаю проект, все было скрыто, в том числе в панели задач, если мне не нужно его показывать..
переопределить 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); } ... }
Почему это вообще так?
Почему бы просто не запустить как консольное приложение и показать форму, когда это необходимо? Нет ничего, кроме нескольких ссылок, отделяющих консольное приложение от приложения форм.
Не нужно быть жадным и брать память, необходимую для формы, когда вам это может даже не понадобиться.
основываясь на различных предложениях, все, что мне нужно было сделать, это:
чтобы скрыть форму:
Me.Opacity = 0 Me.ShowInTaskbar = falseпоказать в виде:
Me.Opacity = 100 Me.ShowInTaskbar = true
Я делаю это так - с моей точки зрения самый простой способ:
установите для формы 'StartPosition' значение 'Manual' и добавьте его в конструктор формы:
Private Sub InitializeComponent() . . . Me.Location=New Point(-2000,-2000) . . . End Subубедитесь, что местоположение установлено на что-то за пределами или ниже размеров экрана. Позже, когда вы хотите показать форму, установите местоположение на что-то в пределах размеров экрана.
Comments