2009-10-20 12 views
6

Domanda strana, ma che mi lascia un po 'perplesso. Ai vecchi tempi in cui avevamo Terminals e DOS, in genere le applicazioni avevano solo una "finestra", e quella era a schermo intero. Quando le persone cambiavano funzioni, non c'era il concetto di aprire una nuova finestra, ma il contenuto della finestra principale veniva sovrascritto. Quindi c'era solo una finestra principale, ma più schermi che erano stati renderizzati.Implementazione di più schermate in un'applicazione

Come si può creare qualcosa di simile in un'applicazione moderna, WinForms o WPF?

Sembra che ci siano due approcci:

  • avere più finestre. Questo è il solito approccio e in genere questo ha senso consentire all'utente di lavorare con più finestre contemporaneamente, ma questo potrebbe non essere richiesto/desiderato. L'uso di ShowDialog() invece di Show() è il solito modo di creare il secondo Window Modal.
  • Dispone di una sola finestra, ma con un controllo TabControl. Nascondi le schede e cambiale automaticamente. Questo è vicino al comportamento "Una finestra, più schermi", ma naturalmente diventa caotico dato che tutti i controlli sono nella stessa classe Form (sebbene si possa sostenere che ciò imponga la corretta denominazione dei controlli. classi parziali e uno .cs per schermo)

Mi chiedo se esiste un modo migliore? Essenzialmente qualcosa che dice "Guarda, non mi importa di cose come lo stile/le icone dei bordi o la striscia del menu principale. Tutto ciò che voglio è che tu faccia apparire questo schermo in quest'area". Un po 'come le Pagine Master ASP.net in cui le pagine reali definiscono solo il contenuto che viene reso in Segnaposto.

C'è qualche corretto meccanismo per fare qualcosa del genere?

Oppure c'è qualcosa di sbagliato con l'intero approccio?

risposta

7

Un approccio sarebbe quello di implementare ogni schermata come controllo utente e caricare e scaricare dinamicamente questi controlli nella finestra principale secondo necessità. Ho usato questo approccio in un'applicazione Windows Mobile e ha funzionato abbastanza bene.

+1

+1; Stavo solo scrivendo una variazione di questa risposta. Ora non devo! –

+0

Questa è una grande idea, soprattutto perché i controlli utente possono essere inseriti in altri contenitori 8come un pannello), il che rende la gestione indolore. –

1

Non ho sentito di un framework specifico per farlo, ma renderei ogni pagina un UserControl, o eventualmente una sottoclasse di un controllo con la logica di rendering desiderata. Questi controlli di pagina sarebbero tutti membri del modulo e aggiunti alla sua raccolta Controls come necessario (o se ce ne sono troppi, creati secondo necessità). Avrebbero proprietà come Dock = DockStyle.Fill impostate durante l'inizializzazione. Quando le pagine che cambiano:

void ChangePage(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
    Controls.Add(sender as Control); 
}
3

Considerando che lei ha citato WPF, vale la pena ricordare che Prism (il framework di interfaccia utente composta da MPP) sarebbe attuare tale utilizzando più viste (UserControls) sia all'interno di un singolo controller (per lo stesso aggregato generale) o più controller (su più aggregati).

O la vista o il relatore può attivare un comando (o trasmettere un evento tramite IEventAggregator) e il controller di navigazione può rispondere modificando la vista corrente assegnata alla "regione" appropriata (potrebbe essere disponibile solo una). In effetti, il modello di regione di Prism è abbastanza simile al modello MasterPage/Placeholder, quindi potresti volerlo esaminare.

Il prisma potrebbe anche includere il monitoraggio della cronologia di navigazione (indietro/avanti), ma non l'ho usato se lo fa.

1

Io lavoro come sviluppatore C# e posso dirvi che passo dopo passo comincio a utilizzare UserControl per più schermate (pagine) applicazioni. Costruisco la mia classe base per una pagina, chiamata BasePage che estende UserControl e la estendo per ogni pagina di cui ho bisogno (MainPage, SettingsPage ecc.). Nel MainForm (l'unica forma dell'app) ho aggiunto un controllo BasePage (ad esempio denominato CurrentPage) in cui posso caricare la pagina necessaria. dal MainForm invio gli eventi necessari a CurrentPage. Penso che questa sia la soluzione migliore per questo tipo di applicazione in cui sono necessari più moduli in un'unica forma. Questa è la struttura che utilizzo per tutte le mie applicazioni con più pagine.

Se si utilizza il controllo struttura a schede, si finirà per soffocare il modulo con tutti i controlli di tutte le schede caricate contemporaneamente. Ho visto progetti con 10+ schede, applicazioni molto complesse che sono molto lente e difficili da codificare.

Spero che questa risposta sia utile!

Problemi correlati