2013-02-19 8 views
5

Quindi ho creato una finestra con un'icona di barra di sistema. La finestra si avvia ridotta a icona e riappare quando si fa clic sull'icona Icona della barra delle applicazioni. Tuttavia, funziona SOLO quando si fa clic sul pulsante Riduci a icona. Se si fa clic sul pulsante di uscita rosso, la finestra scompare, l'icona del vassoio di sistema rimane (come dovrebbe) ma quando si fa clic su di esso il programma genera un errore.Aprire una finestra dall'icona di vassoio di sistema

Non può impostare la visibilità o chiamare Show, ShowDialog, o WindowInteropHelper.EnsureHandle dopo una finestra ha chiuso.

Ecco il codice relativo

public partial class MainWindow : Window 
{ 
    public static NotifyIcon icon; 

    List<string> food = new List<string>(); 
    bool on = false; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     food.Add("Breakfast"); 
     food.Add("Soups"); 
     food.Add("Vegetables"); 
     food.Add("Crab roll"); 
     food.Add("Sushi"); 
     food.Add("Egg rolls"); 
     food.Add("Salad"); 


     MainWindow.icon = new NotifyIcon(); 

     window1.WindowState = WindowState.Minimized; 

     icon.Icon = new System.Drawing.Icon("favicon.ico"); 
     icon.Visible = true; 

     icon.Click += new EventHandler(icon_Click); 
     icon.BalloonTipClicked += new EventHandler(icon_BalloonTipClicked); 
     icon.DoubleClick += new EventHandler(icon_DoubleClick); 
     icon.BalloonTipClosed += new EventHandler(icon_BalloonTipClosed); 
     icon.MouseMove += new System.Windows.Forms.MouseEventHandler(icon_MouseMove); 
     StateChanged += new EventHandler(MainWindow_StateChanged); 

    } 

    void icon_BalloonTipClicked(object sender, EventArgs e) 
    { 
     this.Show(); //This is where the error is 
     window1.WindowState = WindowState.Normal; 
    } 

    void icon_DoubleClick(object sender, EventArgs e) 
    { 
     this.Show(); //This is where the error is 
     window1.WindowState = WindowState.Normal; 
    } 

    void icon_BalloonTipClosed(object sender, EventArgs e) 
    { 
     on = false; 
    } 

    void icon_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 

     if (!on) 
     { 
      icon.BalloonTipText = ""; 
      foreach(string item in food){ 
       if (!item.Contains("Breakfast") && !item.Contains("Soups") && !item.Contains("Vegetables")) 
       { 
        icon.BalloonTipText += item+"\n"; 
       } 
      } 
      icon.ShowBalloonTip(10); 
      on = true; 
     } 

    } 

    void MainWindow_StateChanged(object sender, EventArgs e) 
    { 
     if (window1.WindowState == WindowState.Minimized) 
     { 
      this.Hide(); 
     } 
    } 

    private void icon_Click(Object sender, EventArgs e) 
    { 
     icon.BalloonTipText = ""; 
     foreach (string item in food) 
     { 
      if (!item.Contains("Breakfast") && !item.Contains("Soups") && !item.Contains("Vegetables")) 
      { 
       icon.BalloonTipText += item + "\n"; 
      } 
     } 
     icon.ShowBalloonTip(10); 
     on = true; 

    }   
} 
+0

È il codice _relevant_ o è tutto il codice. Questo è un sacco di codice da guardare. –

+0

Haha yeah, mi dispiace rilevante pertinente suppongo ... –

risposta

5

Intercept caso Closing della finestra, e annullare (questo sarà impedire che la finestra di chiusura) - poi nascondere la finestra invece:

public MainWindow() 
    { 
     // Subscribe to closing event (when X is pressed) 
     this.Closing += MainWindow_Closing; 
     InitializeComponent(); 
    } 

    void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     // Prevent window from closing 
     e.Cancel = true; 

     // Hide window 
     this.Hide(); 
    } 
+1

Ecco perché amo questo sito. Non riesco nemmeno ad accettarlo come risposta, ma l'ho capito così in fretta. Grazie funziona! –

+2

Felice di averlo aiutato! Sarai in grado di accettare in ~ 7 minuti :) – Blachshma