domenica 17 luglio 2016

WPF NotifyIcon

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_wpf-notifyicon-in-application-create-run_1446.aspx

 In questo articolo vedremo come realizzare in un progetto di tipo “Windows Presentation Foundation” (WPF) con la possibilità di dotare l’applicativo con una funzionalità che permette di nasconderlo all’avvio e visualizzare una icona nella traybar per visualizzarlo nuovamente oppure nasconderlo, proprio come si fa nelle “Windows Application” con il controllo NotifyIcon.
Procedimento
Si crea un nuovo progetto di tipo “WPF”, selezionando il linguaggio di proprio interesse.
A questo punto aggiungere nei riferimenti il puntato alle librerie “System.Drawing” e “System.Windows.Forms” per la gestione dei controlli, il tutto come mostrato in figura 1.


Figura 1 – L’aggiunta dei riferimenti.

Prima di passare alla stesura del codice, dobbiamo inserire nella cartella “Bin” dove si troverà il file eseguibile, l’icona (file .ico) che sarà visibile nella traybar, per intenderci accanto all’orologio.


Figura 2 - L’icona che utilizzeremo.

A questo punto non ci resta che scrivere il codice.
Stesura del codice
Passiamo in visualizzazione codice, la prima cosa da fare è quella di andare nel file “XAML” ed in particolare nel file “Application.xaml” per VB.Net e “App.xaml” per il linguaggio di programmazione C#.
A questo punto nella parte markup, togliere il seguente tag.


StartupUri="MainWindow.xaml"


Ora passiamo in visualizzazione codice, dove scrivere il codice relativo al linguaggio di programmazione VB.Net e C#, per i file “App.xaml.cs” e “Application.xaml.cs”.
A questo punto dobbiamo inserire lo spazio dei nomi per la gestione delle classi per la notifica (notifyIcon) e per la grafica (drawing).
Qui di seguito si riporta il frammento di codice delle suddette dichiarazioni.


VB.Net

Imports System.Windows

Imports System.ComponentModel

 
C#

using System.Windows;

using System.ComponentModel;


Dichiariamo a livello di classe un oggetto di tipo NotifyIcon, il quale avrà il compito di visualizzare l’icona nella traybar ed le varie funzionalità, ed una variabile di tipo bolean per decidere se visualizzare o no l’icona.
Qui di seguito si riporta il frammento di codice.


VB.Net

Private Notifica As System.Windows.Forms.NotifyIcon

    Private Uscita As Boolean

 C#

private System.Windows.Forms.NotifyIcon Notifica;

        private bool Uscita;


Ora non ci resta che creare i metodi per gestire i vari eventi che si verificano.
Ed in particolare, le funzioni per visualizzare il form quando si clicca una determinata e dal momento in cui si esce dall’applicativo.
Qui di seguito si riporta il frammento di codice.


VB.Net

Private Sub Esci()

        Uscita = True

        MainWindow.Close()

        Notifica.Dispose()

        Notifica = Nothing

    End Sub

 

    Private Sub VisualizzaForm()

        If MainWindow.IsVisible Then

            If MainWindow.WindowState = WindowState.Minimized Then

                MainWindow.WindowState = WindowState.Normal

            End If

            MainWindow.Activate()

        Else

            MainWindow.Show()

        End If

    End Sub

 
C#

private void Esci()

        {

            Uscita = true;

            MainWindow.Close();

            Notifica.Dispose();

            Notifica = null;

        }

 

        private void VisualizzaForm()

        {

            if (MainWindow.IsVisible)

            {

                if (MainWindow.WindowState == WindowState.Minimized)

                {

                    MainWindow.WindowState = WindowState.Normal;

                }

                MainWindow.Activate();

            }

            else

            {

                MainWindow.Show();

            }

        }



Dobbiamo creare altri due metodi o meglio una funzione per la creazione del menu contestuale, quando si fa click con il tasto destro del mouse sull’icona, e la gestione dell’evento “Closing” della form.
Qui di seguito si riporta le suddette operazioni per i linguaggi VB.Net e C#



VB.Net

Private Sub CreazioneMenu()

        Notifica.ContextMenuStrip = New System.Windows.Forms.ContextMenuStrip()

        AddHandler Notifica.ContextMenuStrip.Items.Add("Apri").Click, AddressOf VisualizzaForm

        AddHandler Notifica.ContextMenuStrip.Items.Add("Esci").Click, AddressOf Esci

    End Sub

Private Sub MainWindow_Closing(sender As Object, e As CancelEventArgs)

        If Not Uscita Then

            e.Cancel = True

            MainWindow.Hide()

        End If

    End Sub

 

 

C#

  private void CreazioneMenu()

        {

            Notifica.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();

            Notifica.ContextMenuStrip.Items.Add("Apri").Click += (s, e) => VisualizzaForm();

            Notifica.ContextMenuStrip.Items.Add("Esci").Click += (s, e) => Esci();

        }

 

    private void MainWindow_Closing(object sender, CancelEventArgs e)

        {

            if (!Uscita)

            {

                e.Cancel = true;

                MainWindow.Hide();

            }

        }


Ora non ci resta che scrivere il codice nell’evento “Startup” che riguarda il momento in cui viene avviata il programma.
In questo evento, vengono creati i vari gestori di evento ed inizializzato l’oggetto per la notifica.
Qui di seguito il frammento di codice.


VB.Net

  Protected Overrides Sub OnStartup(e As StartupEventArgs)

        MyBase.OnStartup(e)

        MainWindow = New MainWindow()

        AddHandler MainWindow.Closing, AddressOf MainWindow_Closing

 

        Notifica = New System.Windows.Forms.NotifyIcon()

        AddHandler Notifica.DoubleClick, AddressOf VisualizzaForm

        Notifica.Icon = New System.Drawing.Icon("accept.ico")

        Notifica.Visible = True

 

        CreazioneMenu()

    End Sub


C#

  protected override void OnStartup(StartupEventArgs e)

        {

            base.OnStartup(e);

            MainWindow = new MainWindow();

            MainWindow.Closing += MainWindow_Closing;

 

            Notifica = new System.Windows.Forms.NotifyIcon();

            Notifica.DoubleClick += (s, args) => VisualizzaForm();

            Notifica.Icon = new System.Drawing.Icon("accept.ico");

            Notifica.Visible = true;

 

            CreazioneMenu();

        }





Figura 3 - L'icona nella traybar

Conclusioni
In questo articolo si è fornito al lettore una tecnica di come aggiungere alla propria applicazioni la possibilità di gestire il proprio programma la funzionalità di ridurlo a icona nella barra dell’orologio, dando così all’utilizzatore di Windows, di avere poche finestre aperte ed al tempo stesso il programma già attivo.
Tecnica usata in passato per lo sviluppo di applicazioni di tipo “Windows Application” ora applicabile anche per i progetti di tipo Windows Presentation Foundation”.

Nessun commento: