2013-02-19 19 views
5

Stworzyłem więc okno z ikoną zasobnika systemowego. Okno zaczyna się od zminimalizowania i pojawi się ponownie po kliknięciu ikony w zasobniku systemowym. Jednak działa TYLKO po kliknięciu przycisku minimalizacji. Po kliknięciu czerwonego przycisku wyjścia okno zniknie, ikona paska zadań pozostanie (tak jak powinna), ale po kliknięciu na nią program zgłosi błąd.Otwieranie okna z ikony tacki systemowej

Nie można ustawić widoczność lub zadzwonić show, ShowDialog lub WindowInteropHelper.EnsureHandle po zamknięciu okna.

Oto odpowiedni kod

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

Czy to jest kod _levevant_, czy też jest to cały kod. To dużo kodu do obejrzenia. –

+0

Haha tak, przepraszam, istotnie ma znaczenie. Przypuszczam ... –

Odpowiedz

5

Intercept zdarzenie Closing okna i anulować to (będzie to zapobiec okno zamykania) - następnie hide okno zamiast:

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

Dlatego właśnie uwielbiam tę stronę. Nie mogę nawet zaakceptować tego jako odpowiedzi, ale dostałem to tak szybko. Dzięki to działa! –

+2

Cieszę się, że pomogło! Będziesz mógł przyjąć w ciągu ~ 7 minut :) – Blachshma