I have a class for Application Context and in it, among other things i have some methods to send a Form1 class to system-tray, my problem is how to show already instantiated class From1 while still running in system-tray, example:
class MyApplicationContext : ApplicationContext
{
private NotifyIcon TrayIcon;
private ContextMenuStrip TrayIconContextMenu;
private ToolStripMenuItem CloseMenuItem;
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
// How to show Form1 hire.
}
//...
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//...
}
If i instantiate a new class it will give me the new form and all my running processes will be gone example:
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
Form1 frm = new Form1();
frm.Show(); //How to show my form?
}
Not sure if prototype pattern will work here and is there an easier solution?
This is my class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Forms;
using System.Windows;
namespace DJBackupDB
{
class MyApplicationContext : ApplicationContext
{
//Component declarations
private NotifyIcon TrayIcon;
private ContextMenuStrip TrayIconContextMenu;
private ToolStripMenuItem CloseMenuItem;
public static Form1 form;
public MyApplicationContext()
{
Application.ApplicationExit += new EventHandler(this.OnApplicationExit);
InitializeComponent();
TrayIcon.Visible = true;
}
private void InitializeComponent()
{
TrayIcon = new NotifyIcon();
TrayIcon.BalloonTipIcon = ToolTipIcon.Info;
TrayIcon.BalloonTipText =
"I noticed that you double-clicked me! What can I do for you?";
TrayIcon.BalloonTipTitle = "You called Master?";
TrayIcon.Text = "My fabulous tray icon demo application";
//The icon is added to the project resources.
//Here I assume that the name of the file is 'TrayIcon.ico'
TrayIcon.Icon = Properties.Resources.logo;
//Optional - handle doubleclicks on the icon:
TrayIcon.DoubleClick += TrayIcon_DoubleClick;
//Optional - Add a context menu to the TrayIcon:
TrayIconContextMenu = new ContextMenuStrip();
CloseMenuItem = new ToolStripMenuItem();
TrayIconContextMenu.SuspendLayout();
//
// TrayIconContextMenu
//
this.TrayIconContextMenu.Items.AddRange(new ToolStripItem[] {
this.CloseMenuItem});
this.TrayIconContextMenu.Name = "TrayIconContextMenu";
this.TrayIconContextMenu.Size = new Size(153, 70);
//
// CloseMenuItem
//
this.CloseMenuItem.Name = "CloseMenuItem";
this.CloseMenuItem.Size = new Size(152, 22);
this.CloseMenuItem.Text = "Close the tray icon program";
this.CloseMenuItem.Click += new EventHandler(this.CloseMenuItem_Click);
TrayIconContextMenu.ResumeLayout(false);
TrayIcon.ContextMenuStrip = TrayIconContextMenu;
}
private void OnApplicationExit(object sender, EventArgs e)
{
//Cleanup so that the icon will be removed when the application is closed
TrayIcon.Visible = false;
}
private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
form.Show();
}
private void CloseMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Do you really want to close me?",
"Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation,
MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
Application.Exit();
}
}
}
}
You'll have to store your form object somewhere you can access it in the event. Make a class member field for the form just like you have for the NotifyIcon and other things.
Then when you create your ApplicationContext, set the form field to the Form1 object.
Then inside the click event handler, you can just call: