it-swarm-vi.tech

Biểu mẫu đơn khi khởi động

Tôi có một ứng dụng có một biểu mẫu trong đó và trên phương thức Tải tôi cần ẩn biểu mẫu đó.

Biểu mẫu sẽ tự hiển thị khi có nhu cầu (nghĩ dọc theo dòng của cửa sổ bật lên kiểu Outlook 2003), nhưng tôi có thể tìm ra cách ẩn biểu mẫu khi tải mà không có gì lộn xộn.

Bất kỳ đề xuất?

72
Pondidum

Tôi đang đến đây từ C #, nhưng sẽ rất giống trong vb.net.

Trong tệp chương trình chính của bạn, trong phương thức Chính, bạn sẽ có một cái gì đó như:

Application.Run(new MainForm());

Điều này tạo ra một biểu mẫu chính mới và giới hạn thời gian tồn tại của ứng dụng đối với thời gian tồn tại của biểu mẫu chính.

Tuy nhiên, nếu bạn xóa tham số vào Application.Run (), thì ứng dụng sẽ được khởi động mà không có biểu mẫu nào được hiển thị và bạn sẽ được tự do hiển thị và ẩn các biểu mẫu bao nhiêu tùy thích.

Thay vì ẩn biểu mẫu trong phương thức Tải, hãy khởi tạo biểu mẫu trước khi gọi Application.Run (). Tôi giả sử biểu mẫu sẽ có Thông báo trên đó để hiển thị biểu tượng trong thanh tác vụ - điều này có thể được hiển thị ngay cả khi bản thân biểu mẫu chưa hiển thị. Gọi Form.Show() hoặc Form.Hide() từ các trình xử lý của các sự kiện NotifyIcon sẽ hiển thị và ẩn biểu mẫu tương ứng.

108
Grokys

Thông thường bạn sẽ chỉ làm điều này khi bạn đang sử dụng biểu tượng khay hoặc một số phương pháp khác để hiển thị biểu mẫu sau, nhưng nó sẽ hoạt động tốt ngay cả khi bạn không bao giờ hiển thị biểu mẫu chính của mình.

Tạo một bool trong lớp Form của bạn được mặc định là false:

private bool allowshowdisplay = false;

Sau đó ghi đè phương thức SetVisibleCore

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

Bởi vì Application.Run () thiết lập các biểu mẫu .Visible = true sau khi tải biểu mẫu, điều này sẽ chặn nó và đặt thành sai. Trong trường hợp trên, nó sẽ luôn đặt nó thành false cho đến khi bạn bật nó bằng cách đặt allowhowdisplay thành true.

Bây giờ sẽ giữ cho biểu mẫu không hiển thị khi khởi động, bây giờ bạn cần kích hoạt lại SetVisibleCore để hoạt động đúng bằng cách đặt allowhowdisplay = true. Bạn sẽ muốn làm điều này trên bất kỳ chức năng giao diện người dùng nào hiển thị biểu mẫu. Trong ví dụ của tôi, đó là sự kiện nhấp chuột trái trong đối tượng notiyicon của tôi:

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

Tôi sử dụng cái này:

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

Rõ ràng bạn phải thay đổi điều kiện if với bạn.

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

        base.OnLoad(e);
    }
19
Chriz

Tại thời điểm xây dựng biểu mẫu (Nhà thiết kế, chương trình Chính hoặc nhà xây dựng biểu mẫu, tùy thuộc vào mục tiêu của bạn),

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

Khi bạn cần hiển thị biểu mẫu, có lẽ là về sự kiện từ Thông báo của bạn, đảo ngược khi cần thiết,

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

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

Các sự kiện hiển thị/ẩn liên tiếp có thể đơn giản hơn là sử dụng các thuộc tính Hiển thị của Biểu mẫu hoặc các phương thức Hiển thị/Ẩn.

14
Jeff

Cố gắng ẩn ứng dụng từ thanh tác vụ là tốt.

Để làm điều đó xin vui lòng sử dụng mã này.

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

   base.OnLoad(e);
   }

Cảm ơn. Ruhul

5
Metallic Skeleton

Tôi đã đấu tranh với vấn đề này rất nhiều và giải pháp đơn giản hơn tôi nhiều. Lần đầu tiên tôi đã thử tất cả các đề xuất ở đây nhưng sau đó tôi không hài lòng với kết quả và điều tra thêm một chút. Tôi thấy rằng nếu tôi thêm:

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

Nó đang hoạt động tốt. nhưng tôi muốn một giải pháp đơn giản hơn và hóa ra là nếu bạn thêm:

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

Bạn sẽ muốn đặt trạng thái cửa sổ ở mức tối thiểu và hiển thị trên thanh tác vụ thành false. Sau đó, ở cuối biểu mẫu của bạn Tải trạng thái cửa sổ thiết lập ở mức tối đa và hiển thị trên thanh tác vụ thành đúng

    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

Đặt cái này trong Program.cs của bạn:

FormName FormName = new FormName ();

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

Sử dụng điều này khi bạn muốn hiển thị biểu mẫu:

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

Ghi đè OnVisibleChanged trong Biểu mẫu

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

    base.OnVisibleChanged(e);
}

Bạn có thể thêm kích hoạt nếu bạn có thể cần hiển thị nó tại một số điểm

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

Điều này hoạt động hoàn hảo cho tôi:

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

Khi tôi khởi chạy dự án, mọi thứ đều bị ẩn kể cả trên thanh tác vụ trừ khi tôi cần hiển thị nó ..

0
Willy David Jr

Khởi chạy một ứng dụng mà không có hình thức nghĩa là bạn sẽ phải tự mình quản lý việc khởi động/tắt ứng dụng.

Bắt đầu các hình thức tắt vô hình là một lựa chọn tốt hơn.

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

Đây là một cách tiếp cận đơn giản:
[.__.] Hiện tại nó đang ở trong trình biên dịch C # (Tôi không có trình biên dịch 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

Tôi đã gặp một vấn đề tương tự như người gửi bưu điện nơi mã để ẩn biểu mẫu trong sự kiện form_Load đã kích hoạt trước khi biểu mẫu được tải hoàn tất, khiến phương thức Hide () không thành công (không bị lỗi, chỉ không hoạt động như mong đợi).

Các câu trả lời khác rất hay và hiệu quả nhưng tôi thấy rằng, nói chung, sự kiện form_Load thường có các vấn đề như vậy và những gì bạn muốn đưa vào đó có thể dễ dàng đi vào hàm tạo hoặc sự kiện form_Shown.

Dù sao, khi tôi di chuyển cùng một mã kiểm tra một số thứ sau đó ẩn biểu mẫu khi không cần thiết (một hình thức đăng nhập khi đăng nhập một lần thất bại), nó hoạt động như mong đợi.

0
blind Skwirl

Ví dụ này hỗ trợ khả năng tàng hình hoàn toàn cũng như chỉ NotifyIcon trong khay Hệ thống và không có nhấp chuột và nhiều hơn nữa.

Xem thêm tại đây: http://code.msdn.Microsoft.com/TheNotifyIconExample

0
TheUberOverLord

Để bổ sung cho Phản hồi của Groky (đây thực sự là phản hồi tốt nhất theo quan điểm của tôi), chúng tôi cũng có thể đề cập đến lớp ApplicationContext , cũng cho phép (như được hiển thị trong mẫu của bài viết) khả năng mở hai (hoặc thậm chí nhiều hơn) Biểu mẫu khi khởi động ứng dụng và kiểm soát tuổi thọ của ứng dụng với tất cả chúng.

0
Eugenio Miró