2010-03-11 5 views
5

J'ai une application dans vb.net qui commence par une sous-fonction faire certaines choses et décider si elle se montre ou non. Quand il se montre, il le fait en invoquant dialog.ShowDialog().Comment masquer une boîte de dialogue modale sans retourner de .ShowDialog?

Lorsque dialog.ShowDialog() retourne, l'application effectue un nettoyage et se termine.

Je voudrais trouver un moyen de masquer temporairement la boîte de dialogue (l'envoyer à la barre d'état système) sans retourner de la fonction ShowDialog(). Toutefois, dès que je fais un me.Hide() dans le code du formulaire, le formulaire est effectivement masqué, mais la fonction ShowDialog() renvoie et le processus est fermé. Je comprends que c'est le comportement attendu.

Donc, ma question est comment puis-je obtenir cet effet? C'est lancer un dialogue, qui peut être caché, et bloquer jusqu'à ce que l'utilisateur veuille vraiment quitter l'application.

+0

est-il ne minimisons pas sur le plateau ce que vous cherchez au lieu de se cacher? Voir http://stackoverflow.com/questions/46918/whats-the-proper-way-to-minimize-to-tray-a-c-winforms-app –

Répondre

4

Vous ne pouvez pas faire ce travail, ShowDialog() retournera toujours lorsque le formulaire est caché. L'astuce consiste à utiliser un formulaire normal et un appel normal à Application.Run() mais pour l'empêcher de devenir visible immédiatement. Coller ce code dans votre classe de formulaire:

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean) 
    If Not IsHandleCreated Then 
     CreateHandle() 
     value = false 
    End If 
    MyBase.SetVisibleCore(value) 
End Sub 

Prenez garde que votre gestionnaire d'événements de charge ne fonctionnera pas jusqu'à ce que la forme devient réellement visible alors assurez-vous de faire une initialisation dans le constructeur Sub New.

+0

@nobugz: Merci, Application.Run était exactement ce dont j'avais besoin. –

5

Si vous masquez la boîte de dialogue, retournera à partir de ShowDialog(). Oubliez d'essayer de changer cela, vous ne pouvez pas.

Vous pourriez réduire la boîte de dialogue.

form1.WindowState = FormWindowState.Minimized; 

Ou vous pouvez le positionner hors écran.

form.Left = -16384; 

Ou vous pouvez le rendre transparent Modifying opacity of any window from C#

+0

Assurez-vous que ShowInTaskbar = true si vous voulez minimiser. – FlappySocks

-1

vous pouvez utiliser un drapeau.

  1. Ajouter un drapeau à votre formulaire: bool done = false;
  2. set = true fait quand il est terminé (en cas FormClosed).
  3. chèque de drapeau en fonction de l'appelant (est-il fait?)

    bool stilInMyFrm = false; 
    MyFrm myFrm = new myFrm(); 
    
    try 
    { 
        stilInMyFrm = true; 
        myFrm.ShowDialog(); 
        while (!myFrm.done) 
         Application.DoEvents(); 
    } 
    finally 
    { 
        stilInMyFrm = false; 
        cleanup(); 
    } 
    
Questions connexes