9
votes

Comment cacher une boîte de dialogue modale sans retourner de .showdialog?

J'ai une application dans VB.NET qui commence par une sous-fonction fait certaines choses et décidez s'il se présente ou non. Quand il se présente, il le fait en invoquant dialog.showdialog () .

Lorsque dialog.showdialog () retourne, l'application fait un peu de nettoyage et de fin.

J'aimerais trouver un moyen de masquer temporairement la boîte de dialogue (envoyez-la à la barre système) sans retour de la fonction showdialog (). Cependant, dès que je fais un moi.hide () dans le code du formulaire, le formulaire est effectivement masqué, mais la fonction de fonction showdialog () et le processus est fermé.

Je comprends que c'est le comportement attendu. Donc, ma question est de savoir comment puis-je obtenir cet effet? C'est lancé une boîte de dialogue, qui peut être masquée et bloquer jusqu'à ce que l'utilisateur souhaite vraiment quitter l'application.


1 commentaires

Réduisez-vous au plateau que vous recherchez au lieu de vous cacher? Voir Stackoverflow.com/Questtions/46918/...


5 Réponses :


4
votes

Vous ne pouvez pas faire ce travail, Showdialog () reviendra toujours lorsque le formulaire est caché. L'astuce consiste à utiliser une forme régulière et un appel normal à l'application.Run () mais pour empêcher de devenir visible immédiatement. Coller ce code dans votre classe: xxx

méfiez que votre gestionnaire d'événements de charge ne fonctionnera pas tant que le formulaire devient visible alors assurez-vous de faire une initialisation dans le sous-constructeur sous-constructeur.


0 commentaires

6
votes

Si vous masquez la boîte de dialogue, vous sera retour de showdialog (). Oubliez d'essayer de changer cela, vous ne pouvez pas.

Vous pourriez être capable de minimiser la boîte de dialogue. xxx

ou vous pouvez la positionner hors écran. xxx

ou vous pouvez le rendre transparent Modification de l'opacité de toute fenêtre de C #


1 commentaires

Assurez-vous que ShowintaskBar = true si vous allez minimiser.



-1
votes

Vous pouvez utiliser un drapeau.

  1. ajoutez un drapeau à votre formulaire: bool fait = false; code> li>
  2. Ensemble terminé = true quand il est complet (dans l'événement formé). LI>
  3. vérifiez le drapeau dans la fonction de l'appelant (est-ce terminé?) P>

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


0 commentaires

1
votes

Une autre solution de contournement consiste à modifier la propriété d'opacité de la forme modélisée à 0 pour le rendre entièrement transparent.

private void MyModalForm_Load(object sender, EventArgs e)
{
    bool isShowing = true;
    //Do your thing.
    if(!isShowing) this.Opacity = 0.0;
    else this.Opacity = 1.0;
}


1 commentaires

Opacité est une bonne idée et il ne casse pas le comportement de ShowDialog



0
votes

J'ai fait cela, Formulaire de code intérieur:

private bool CanAccess()
{
    //your condition to access or not
}

private bool AlreadyCreated = false;
protected override void SetVisibleCore(bool value)
{
    if (value && !AlreadyCreated && !CanAccess())
    {
        base.SetVisibleCore(false);
        this.Close();
        return;
    }

    AlreadyCreated = true;
    base.SetVisibleCore(value);
}


0 commentaires