Comment créer une interface de type boîte de dialogue de préférences arborescentes en C# ?

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

  •  08-06-2019
  •  | 
  •  

Question

J'écris une application qui n'est essentiellement qu'une boîte de dialogue de préférences, un peu comme la boîte de dialogue de préférences en arborescence que Visual Studio lui-même utilise.La fonction de l'application est simplement un transfert de données d'un périphérique série vers un fichier.Il effectue de très nombreuses transformations sur les données avant de les écrire dans le fichier, de sorte que l'interface graphique de l'application est simplement constituée de tous les paramètres qui dictent ce que devraient être ces transformations.

Quelle est la meilleure façon de concevoir/coder une boîte de dialogue de préférences en arborescence ?La façon dont j'ai procédé consiste à créer la fenêtre principale avec un contrôle d'arborescence ancré sur la gauche.Ensuite, j'ai créé des contrôles de conteneur qui correspondent à chaque nœud de l'arborescence.Lorsqu'un nœud est sélectionné, l'application place le contrôle de conteneur correspondant à ce nœud au premier plan, le déplace vers la bonne position et l'agrandit dans la fenêtre principale.Cela semble vraiment très maladroit lors de sa conception.Cela signifie essentiellement que j'ai des tonnes de contrôles de conteneur au-delà du bord de la fenêtre principale pendant la conception et que je dois continuer à faire défiler la fenêtre principale pour pouvoir travailler avec eux.Je ne sais pas si cela a tout à fait du sens de la façon dont j'écris ceci, mais peut-être que ce visuel pour ce dont je parle aura plus de sens :

form design

Fondamentalement, je dois travailler avec cet énorme formulaire, avec des contrôles de conteneurs partout, puis effectuer un certain nombre de reformatage à l'exécution pour que tout fonctionne.Cela ressemble à un parcelle de travail supplémentaire.Est-ce que je fais ça d'une manière totalement stupide ?Existe-t-il un moyen « évident » plus simple de procéder qui me manque ?

Était-ce utile?

La solution

Une méthode plus simple consiste à créer des formulaires séparés pour chaque « volet » et, dans chaque constructeur de formulaire, à définir

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

De cette façon, chacun de ces formulaires peut être présenté dans son propre concepteur, instancié une ou plusieurs fois au moment de l'exécution et ajouté à la zone vide comme un contrôle normal.

Peut-être que le formulaire principal pourrait utiliser un SplitContainer avec un statique TreeView dans un panneau, et de l'espace pour ajouter ces formulaires dans l'autre.Une fois ajoutés, ils peuvent être feuilletés en utilisant Hide/Show ou BringToFront/SendToBack méthodes.

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

Autres conseils

Greg Hurlman a écrit :

Pourquoi ne pas simplement afficher/masquer le conteneur approprié lorsqu'un nœud est sélectionné dans la grille ?Ayez tous les conteneurs de taille appropriée au même endroit et masquez-les tous sauf ceux par défaut, qui seraient présélectionnés dans la grille lors du chargement.

Malheureusement, c'est ce que j'essaie d'éviter.Je recherche un moyen simple de gérer l'interface pendant la conception, avec un minimum de code de reformatage nécessaire pour la faire fonctionner pendant l'exécution.

J'aime la réponse de Duncan car elle signifie que la conception de l'interface de chaque nœud peut être conservée complètement séparé.Cela signifie que je n'ai pas de chevauchement sur les directives d'accrochage et d'autres avantages en matière de temps de conception.

Je créerais probablement plusieurs classes de panneaux basées sur une classe de base héritant de CustomControl.Ces contrôles auraient alors des méthodes comme Save/Load et des trucs comme ça.Si c'est le cas, je peux concevoir chacun de ces panneaux séparément.

J'ai utilisé un contrôle Wizard qui, en mode conception, gérait plusieurs pages, de sorte que l'on puisse cliquer sur Suivant dans le concepteur et concevoir toutes les pages en même temps via le concepteur.Bien que cela présente plusieurs inconvénients lors de la connexion du code aux contrôles, cela signifie probablement que vous pourriez avoir une configuration similaire en créant des classes de concepteur.Je n'ai jamais moi-même écrit de cours de designer dans VS, donc je ne peux pas dire comment ni si cela en vaut la peine :-)

Je suis un peu curieux de savoir comment vous comptez gérer le chargement/la sauvegarde des valeurs vers/depuis les contrôles ?Il doit y avoir beaucoup de code dans une classe si toutes vos pages sont dans un seul grand formulaire ?

Et encore une autre façon serait bien sûr de générer le code GUI au fur et à mesure que chaque page est demandée, en utilisant des informations sur le type de paramètres disponibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top