Laden...

[wpf] Anwendung im Systray

Erstellt von vbtricks vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.164 Views
vbtricks Themenstarter:in
205 Beiträge seit 2006
vor 16 Jahren
[wpf] Anwendung im Systray

Salut,

gerade bin ich wieder am Werkeln mit WPF und versuche eine Anwendung zu erstellen, die ins Systray minimiert wird.

Wie ich zahlreichen Artikeln im Web entnommen habe, wird das NotifyIcon nicht unter WPF zur Verfügung gestellt, weshalb ich die Version aus dem Windows.Forms Namespace verwende.

Fast alles funktioniert auch soweit, nur ein kleines Problem bleibt bestehen: Wenn das Icon im Systray angeklickt wird, erscheint die Form zwar wieder in der Taskleiste, aber nicht auf dem Bildschirm. Klicke ich dann die Schaltfläche in der Taskleiste an, wird das Fenster aus dem Minimiert-Zustand geholt (Animation) und angezeigt.


namespace WindowsApplication1
{
    public partial class Window1 : System.Windows.Window
    {
        System.Windows.Forms.NotifyIcon ni;

        public Window1()
        {
            InitializeComponent();

            this.StateChanged += new EventHandler(Window1_StateChanged);

            this.ni = new System.Windows.Forms.NotifyIcon();

            this.ni.Icon = 
                System.Drawing.Icon.ExtractAssociatedIcon(@"D:\icon.ico");

            this.ni.Visible = true;

            this.ni.Click += new EventHandler(ni_Click);
        }

        void Window1_StateChanged(object sender, EventArgs e)
        {
            switch (this.WindowState)
            {
                case WindowState.Minimized:
                    this.Visibility = Visibility.Hidden;
                    break;
                default:
                    if (this.Visibility != Visibility.Visible)
                        this.Visibility = Visibility.Visible;
                    break;
            }
        }

        void ni_Click(object sender, EventArgs e)
        {
            if (this.Visibility == Visibility.Visible)
            {
                this.WindowState = WindowState.Minimized;
            }
            else
            {
                this.Visibility = Visibility.Visible;  // anzeigen
                this.WindowState = WindowState.Normal;  // Fenstergröße
                this.Focus();  // Fokus
            }
        }
    }
}

Was läuft da falsch und wie kann ich das korrigieren?

Edit
Damit tut es jetzt:


void notifyIcon1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        if (this.Visibility == Visibility.Hidden)
        {
            this.Visibility = Visibility.Visible;
            this.Show();
            this.WindowState = WindowState.Normal;
            this.Focus();
        }
        else
        {
            this.hiding = true;
            this.WindowState = WindowState.Minimized;
            this.Visibility = Visibility.Hidden;
            this.Hide();
            this.hiding = false;
        }
    }
}


private bool hiding = false;

void MainWindow_StateChanged(object sender, EventArgs e)
{
    if (!this.hiding)
    {
        switch (this.WindowState)
        {
            case WindowState.Minimized:
                this.Visibility = Visibility.Hidden;
                this.Hide();
                break;
        }
    }
}

Danke im Voraus,

Stefan