Charger un formulaire sans le montrer
Version courte: je veux déclencher l'événement Form_Load() sans effectuer de la forme visible. Cela ne fonctionne pas car Show() ignore la valeur actuelle de la propriété Visible:
tasksForm.Visible = false;
tasksForm.Show();
Version longue: j'ai une application WinForms avec deux formes: les principaux et les tâches. La forme principale est toujours affichée. L'utilisateur peut soit cliquer sur un bouton pour ouvrir le formulaire des tâches, ou cliquez sur quelques boutons qu'il suffit d'exécuter une tâche directement sans ouvrir le formulaire des tâches.
Lorsqu'un utilisateur demande pour exécuter une tâche directement, je voudrais simplement appeler certaines méthodes publiques sur le formulaire des tâches sans la montrer. Malheureusement, la tâche de la logique repose sur des trucs qui se passe dans l'événement Form_Load (). La seule façon que je peux trouver pour déclencher Form_Load() est d'appeler la méthode Show(). Le meilleur que j'ai pu faire est d'afficher le formulaire dans l'état réduit:
tasksForm.WindowState = FormWindowState.Minimized;
tasksForm.Show();
Je suppose que la solution la plus propre serait de tirer les tâches de la logique des tâches et dans une classe de contrôleur. Alors je peux utiliser cette classe à partir du formulaire principal et de l'tâches, et de charger uniquement les tâches de forme quand j'en ai besoin visibles pour l'utilisateur. Cependant, si c'est une chose facile à charger le formulaire sans l'afficher, ce serait un plus petit changement.
source d'informationauteur Don Kirkby
Vous devez vous connecter pour publier un commentaire.
Je suis totalement d'accord avec Riche B, vous avez besoin de regarder où vous placez votre logique de l'application plutôt que d'essayer de cludge les WinForms mécanismes. L'ensemble de ces opérations et les données que vos Tâches formulaire exposant doit vraiment être dans une classe à part dire une sorte de Contrôleur d'Application ou quelque chose détenus par votre formulaire principal et ensuite utilisé par votre formulaire des tâches de lecture et d'affichage de données en cas de besoin, mais n'a pas besoin d'un formulaire pour être instancié à exister.
Il semble probablement être une douleur, le retravailler, mais vous serez l'amélioration de la structure de l'application et de le rendre plus facile à gérer etc.
Peut-être, il convient de noter ici que vous peut cause de la fenêtre du formulaire à être créé sans l'affichage du formulaire. Je pense qu'il pourrait être légitime de situations de vouloir le faire.
De toute façon, un bon design ou pas, vous pouvez le faire comme ceci:
Je ne pense pas que ce sera la cause de Form_Load() est appelé, mais vous serez en mesure d'appeler f.Invoke() à ce point (qui est ce que j'essaie de faire quand je suis tombé sur ce DONC, la question).
Il me semble que vous avez besoin de s'asseoir et de repenser votre approche ici. Je ne peux pas imaginer une seule raison de votre public les méthodes doivent être dans une forme si vous n'allez pas le montrer. Il suffit de faire une nouvelle classe.
À partir de MSDN:
Sens la seule chose qui serait la cause de la forme de charger, c'est quand il est affiché.
Form.Show();
etForm.Visible = true;
sont exactement la même chose. Fondamentalement, derrière les coulisses, Montrent des contrôles pour des conditions différentes, puis définit Visible sur true. Alors, évidemment, définir visible à false (qui l'est déjà) avant l'affichage du formulaire est vide de sens.Mais oublions les détails techniques. Je suis complètement d'accord avec Riche B et Shaun Austin - la logique ne doit pas être sous cette forme en tout cas.
Parfois, cela serait utile, sans qu'il soit mauvaise conception. Parfois, il pourrait être le début d'une migration de natif géré.
Si vous étiez à la migration d'un c++ application .NET par exemple, vous pouvez simplement faire yourwhole application d'une fenêtre de l' .NET de forme ou de panneau, et progressivement migrer vers l' .NET par se débarrasser de votre c++ app menu, barre d'état, barre d'outils de cartographie et de teh .NEt à votre application à l'aide de la plateforme invoquer etc...
Votre C++ application peut prendre un certain temps à charger, mais le .NET formulaire n'a pas..dans lequel vous pouvez, comme pour cacher la .NEt forme jusqu'à ce que votre c++ application a été initialisée.
J'avais l'opacité=0 et visible=false false après l'appel de montrer, ensuite quand vos c++ application des charges, puis en sens inverse.
Si vous faites de la méthode, alors vous pouvez y accéder directement.... cependant, il peut y avoir des effets secondaires inattendus lorsque vous l'appelez. Mais en la rendant publique, et en l'appelant directement ne sera pas attirer l'écran ou ouvrez le formulaire.
Déplacer obligatoire code d'initialisation de la classe de la forme de la
Load
gestionnaire d'événement dans le constructeur. Pour une classe de Formulaire, l'instanciation d'une instance (par le constructeur), le chargement de formulaire et le formulaire de visibilité sont trois choses différentes, et n'ont pas besoin de se produire en même temps (même si elles ne doivent évidemment se produire dans cet ordre).