Come creare un tipo di interfaccia di dialogo delle preferenze con visualizzazione ad albero in C#?

StackOverflow https://stackoverflow.com/questions/3725

  •  08-06-2019
  •  | 
  •  

Domanda

Sto scrivendo un'applicazione che è fondamentalmente solo una finestra di dialogo delle preferenze, molto simile alla finestra di dialogo delle preferenze della visualizzazione ad albero utilizzata dallo stesso Visual Studio.La funzione dell'applicazione è semplicemente un passaggio di dati da un dispositivo seriale a un file.Esegue moltissime trasformazioni sui dati prima di scriverli nel file, quindi la GUI dell'applicazione è semplicemente composta da tutte le impostazioni che determinano quali dovrebbero essere tali trasformazioni.

Qual è il modo migliore per progettare/codificare una finestra di dialogo delle preferenze di visualizzazione ad albero?Il modo in cui ho proceduto è stato costruire la finestra principale con un controllo ad albero ancorato sulla sinistra.Quindi ho creato controlli contenitore che corrispondono a ciascun nodo dell'albero.Quando viene selezionato un nodo, l'app porta in primo piano il controllo contenitore corrispondente di quel nodo, lo sposta nella posizione corretta e lo ingrandisce nella finestra principale.Sembra davvero, davvero goffo durante la progettazione.Fondamentalmente significa che ho tonnellate di controlli del contenitore oltre il bordo della finestra principale durante la fase di progettazione su cui devo continuare a scorrere la finestra principale per poter lavorare con essi.Non so se questo abbia totalmente senso nel modo in cui lo scrivo, ma forse questa immagine per ciò di cui sto parlando avrà più senso:

form design

Fondamentalmente devo lavorare con questo modulo enorme, con controlli del contenitore ovunque, e poi fare un sacco di riformattazioni in fase di esecuzione per far funzionare tutto.Questo sembra un quantità di lavoro extra.Lo sto facendo in un modo totalmente stupido?C'è qualche modo "ovvio" più semplice per farlo che mi manca?

È stato utile?

Soluzione

Un modo più ordinato è creare moduli separati per ciascun "riquadro" e, in ciascun costruttore di moduli, set

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

In questo modo, ciascuno di questi moduli può essere disposto nel proprio designer, istanziato una o più volte in fase di esecuzione e aggiunto all'area vuota come un normale controllo.

Forse la forma principale potrebbe utilizzare a SplitContainer con uno statico TreeView in un pannello e spazio per aggiungere questi moduli nell'altro.Una volta aggiunti, è possibile sfogliarli utilizzando Hide/Show O BringToFront/SendToBack metodi.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();

Altri suggerimenti

Greg Hurlman ha scritto:

Perché non mostrare/nascondere semplicemente il contenitore appropriato quando un nodo viene selezionato nella griglia?Disponi tutti i contenitori delle dimensioni appropriate nello stesso punto e nascondi tutti tranne quello predefinito, che verrebbe preselezionato nella griglia al caricamento.

Sfortunatamente, è quello che sto cercando di evitare.Sto cercando un modo semplice per gestire l'interfaccia durante la fase di progettazione, con una riformattazione minima del codice necessaria per farla funzionare durante la fase di esecuzione.

Mi piace la risposta di Duncan perché significa che il design dell'interfaccia di ciascun nodo può essere mantenuto completamente separato.Ciò significa che non si sovrappongono le linee guida per lo snap e altri vantaggi in termini di progettazione.

Probabilmente creerei diverse classi di pannelli basate su una classe base che eredita CustomControl.Questi controlli avrebbero quindi metodi come Salva/Carica e cose del genere.Se è così posso progettare ciascuno di questi pannelli separatamente.

Ho utilizzato un controllo guidato che in modalità progettazione gestiva diverse pagine, in modo che fosse possibile fare clic su Avanti nella finestra di progettazione e progettare tutte le pagine contemporaneamente tramite la finestra di progettazione.Sebbene ciò presentasse diversi svantaggi durante la connessione del codice ai controlli, probabilmente significa che potresti avere una configurazione simile costruendo alcune classi di progettazione.Non ho mai scritto corsi di progettazione in VS, quindi non posso dire come o se ne vale la pena :-)

Sono un po' curioso di sapere come intendi gestire il caricamento/salvataggio dei valori sui/dai controlli?Deve esserci molto codice in una classe se tutte le tue pagine sono in un unico grande modulo?

E ancora un altro modo sarebbe ovviamente quello di generare il codice GUI man mano che viene richiesta ciascuna pagina, utilizzando le informazioni sul tipo di impostazioni presenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top