2013-07-22 12 views
11

In ASP.NET, posso fare Session["something"] = something; e quindi posso recuperare in un'altra pagina il valore della sessione. Esiste una sessione in WPF che mi consenta di fare lo stesso in ASP.NET? Noto che non c'è nessuna sessione in WPF perché c'è stato. Poiché ho ottenuto molte pagine di controllo utente, ho bisogno di ottenere i suoi valori e visualizzarli sulla finestra principale.Sessione in WPF?

C'è qualcosa di simile a Session in WPF?

Alcune risorse dicono di usare i cookie. Come lo faccio? la mia è un'applicazione WPF non un'applicazione web WPF?

+2

WPF e Winforms non hanno il tipo di pensiero basato Sessione a cui sei abituato in un'applicazione ASP. – MarkWalls

risposta

14

Se ho capito bene la tua domanda, hai solo bisogno di una sorta di archiviazione globale per determinati valori nel tuo programma.

È possibile creare una classe statica con proprietà statiche pubbliche per i vari valori che è necessario memorizzare ed essere in grado di accedere globalmente all'interno dell'applicazione. Qualcosa di simile:

public static class Global 
{ 
    private string s_sSomeProperty; 

    static Globals() 
    { 
     s_sSomeProperty = ...; 
     ... 
    } 

    public static string SomeProperty 
    { 
     get 
     { 
      return (s_sSomeProperty); 
     } 
     set 
     { 
      s_sSomeProperty = value; 
     } 
    } 

    ... 
} 

In questo modo si può semplicemente scrivere Global.SomeProperty qualsiasi punto del codice in cui la classe Global è disponibile.

Ovviamente, è necessaria la convalida e, se l'applicazione è multithread, un blocco appropriato per garantire che i dati globali (condivisi) siano protetti attraverso i thread.

Questa soluzione è migliore dell'utilizzo di una sessione di tipo simile perché le proprietà saranno fortemente tipizzate e non esiste alcuna ricerca basata su stringhe per il valore della proprietà.

+0

In realtà, se si dispone di un progetto WPF principale, chiamiamolo MainApplicationProject, che fa riferimento a un altro progetto, diciamo ad esempio AdminModuleProject che non funzionerà: se si crea questa classe in AdminModuleProject non sarà possibile utilizzarlo in un'altra ModuleProject. Se crei questa classe nel MainApplicationProject non sarai in grado di usarlo in nessun progetto di riferimento del modulo. –

+0

@ G.Dealmeida Mi dispiace, cosa intendi con questo? – xxbbcc

4

Una possibilità è quella di utilizzare:

Application.Current.Resources["something"] = something; 

non vorrei prendere l'abitudine di usare che troppo spesso però. Penso che sia generalmente per i dati che vengono archiviati una volta (come gli stili) e quindi semplicemente referenziati da altri punti nell'applicazione. Tutto nella tua app di lettura/scrittura di alcuni dati condivisi a livello globale è una cattiva pratica e potrebbe rendere difficile il debug.

-1

Come forse già sapete, in un'applicazione wpf su una macchina desktop, non esiste una cosa come la sessione. Se si implementano account nella propria applicazione wpf e se è possibile fornire un servizio permanente per ciascun utente, sarebbe simile alla sessione. Vi consiglio di provare NDatabase, che è un database di oggetti open source molto semplice e potente.

http://ndatabase.codeplex.com/

Essi forniscono buoni tutorial pure. Controlla il tutorial di 1 minuto e il tutorial di 5 minuti.

0

A mio parere, il modo migliore per farlo sarà quello di conservare nelle proprietà correnti della vostra applicazione come questo:

Application.Current.Properties["stuff"] 

È possibile memorizzare qualsiasi tipo di oggetto, ma non abusarne .

userò personalmente questo tipo di trucchi solo se non ho altro modo per condividere i dati (stesso consiglio di Concessione Winney)

preferisco utilizzare le risorse per la traduzione o le immagini e le proprietà per altri flag/dati solo per cose separate un po '