Répondre

2

J'ai utilisé le code this Wizard dans un projet récent et cela a bien fonctionné.

Il fournit l'expérience de base que vous recherchez.

17

Ce que vous décrivez est un assistant, et vous pourriez vouloir étudier l'approche de Eric J.

Cependant, quand j'ai les cas où je veux avoir plusieurs panneaux dans le même espace dans mon interface utilisateur et je veux changer entre eux dans le concepteur, j'aime utiliser un TabControl et cacher les onglets sur le TabControl. Cela rend l'interface utilisateur plus facile à gérer au moment de la conception et le code est assez simple pour basculer entre les onglets lors de l'exécution.

J'ai fait un contrôle personnalisé qui dérive de TabControl appelé HiddenTabsControl qui est très simple. La classe remplace uniquement WndProc et laisse la classe de base TabControl gérer tout le reste. Tout ce que vous devez faire est:

  • Ajouter un nouvel élément à votre projet
  • Choisissez contrôle personnalisé,
  • Nom quelque chose comme HiddenTabsControl.
  • Modifiez la classe de base à TabControl, supprimez le constructeur et le remplacement OnPaint que Visual Studio a ajouté.
  • Copiez cette dérogation pour WndProc dans la classe:

    protected override void WndProc(ref Message m) 
    { 
        // Hide tabs by trapping the TCM_ADJUSTRECT message 
        if (m.Msg == 0x1328 && !DesignMode) 
        { 
         m.Result = (IntPtr)1; 
        } 
        else 
        { 
         base.WndProc(ref m); 
        } 
    } 
    

Vous pouvez maintenant changer d'onglet dans le concepteur et la conception de l'interface utilisateur facilement et dans le code que vous pouvez gérer les événements pour changer d'onglet selon les besoins. Modification de l'onglet sélectionné est facile à faire avec:

this.hiddenTabsControl.SelectedTab = this.tabPageYouWantVisible; 

Un effet secondaire de supprimer les onglets est l'espace que les onglets occupent lorsque la commande est construit. Les supprimer fera que l'espace occupé par HiddenTabsControl changera en le rétrécissant. Je règle habituellement l'ancre du HiddenTabsControl au fond pour l'empêcher de rétrécir.

+0

+1. C'est une solution simple et merveilleuse. Vous pouvez toujours changer d'onglet avec le clavier, (Ctrl + Tab fonctionne certainement et les touches fléchées si vous placez le focus droit). – Joey

+1

De plus, vous voulez toujours avoir la propriété MultiLine définie sur 'true', sinon les flèches pour faire défiler la barre d'onglets s'affichent, bien que vous ne puissiez pas cliquer dessus. – Joey

+0

Cette méthode n'est pas portable avec Mono. – Luca

2

Une autre approche moins élégante, mais rapide, consiste simplement à ne pas ajouter le panneau au formulaire parent avant l'exécution. En faisant cela, le concepteur n'a aucune idée de l'endroit où le panneau appartient avant la compilation, et il ne sera pas affiché.

Par exemple, trouver le bloc de code où vous ajoutez des contrôles à la forme mère:

   //this->Controls->Add(this->panel_X); 
     this->Controls->Add(this->tabControl); 
     this->Controls->Add(this->menuStrip_topMenu); 

Commentaire ou supprimer l'instruction, puis trouver la poignée à l'événement qui se produit lorsque le formulaire est chargé:

 this->Load += gcnew System::EventHandler(this, &MainForm::MainForm_Load); 

Ensuite, dans la définition du gestionnaire d'événements, ajoutez le contrôle à la forme:

System::Void MainForm_Load(System::Object^ sender, System::EventArgs^ e) { 
... 
... 
this->Controls->Add(this->panel_X); 
} 

Je n'ai pas eu d'effets secondaires indésirables en faisant cela, mais si quelqu'un a une bonne raison de ne pas l'être, je serais intéressé à l'entendre.