Question

Je ne souhaite pas que l'utilisateur interagisse avec mon application lorsqu'un certain arrière-plan est occupé (actif). J'ai créé ce bgw pour que l'application ne semble pas figée lorsqu'elle fonctionne. Mais maintenant, les utilisateurs peuvent se déplacer dans l'application. Comment désactiver mon formulaire / application?

Merci!

Était-ce utile?

La solution

Peut-être définir Enabled sur false ?

this.Enabled = false;

C’est toutefois un peu radical, car cela empêche également le formulaire d’être déplacé, redimensionné ou fermé. Une meilleure approche consisterait à insérer dans votre formulaire un contrôle Panel comportant Dock = Fill et à placer nos autres contrôles dans ce Panel . Vous pouvez ensuite utiliser la propriété Enabled du panneau pour empêcher toute nouvelle saisie de l'utilisateur.

Notez que l'utilisateur sera en mesure de fermer le formulaire. Il devrait donc être géré de manière élégante.

Autres conseils

Vous pouvez également créer un modal "splash occupé" " boîte de dialogue qui s'affiche lorsque la tâche en arrière-plan démarre et supprimée par programme à la fin de la tâche. Vous pouvez également insérer une petite animation dans cette zone pour que les utilisateurs sachent que quelque chose se passe. Vous devez également vous assurer qu'ils ne ferment pas la boîte de dialogue manuellement (ne lui permettent que de la fermer par programme).

Je suis d’accord avec @ michael-todd dans son commentaire ci-dessus, en désactivant les commandes individuelles / les boutons de navigation / etc. tandis que le travailleur de fond travaille semble être une assez bonne solution. Cela vous donnerait un contrôle plus fin sur ce que l'utilisateur peut faire pendant l'opération d'arrière-plan spécifique.

Vous pourriez:

  1. Créez des méthodes pour activer ou désactiver tous les contrôles de navigation / interaction appropriés (en définissant leur propriété Enabled sur true / false, etc. en fonction de chaque contrôle)
  2. Appelez le " Désactiver " Méthode de votre code juste avant d'appeler StartWorkerAsync () sur votre travailleur d'arrière-plan
  3. Dans le gestionnaire d'événements de RunWorkerCompleted, appelez le bouton "Activer". méthode pour réactiver la vue pour l'entrée utilisateur

Il est plus facile de gérer la désactivation de certaines commandes en les plaçant dans un panneau et en les désactivant plutôt qu'en les désactivant:

controlPanel.Enabled = false;

Un moyen courant de bloquer d’autres tâches pouvant répondre à vos besoins consiste à afficher un formulaire avec une barre de progression. J'ai implémenté cela avec succès dans le passé. D'autres programmes font la même chose. Par exemple, dans WinRAR, lorsque l'application est occupée à extraire ou à compresser des fichiers, l'application affiche le formulaire le plus en haut. Cela ressemble à un " modal " formulaire, mais en fait, vous pouvez toujours cliquer sur les autres fonctions demandées par WinRAR, "Souhaitez-vous abandonner l'opération en cours?"

Désactiver la totalité de l'application n'est souvent pas nécessaire et peut ne pas être intuitif. Alors, demandez-vous si vous avez vraiment besoin de bloquer l'interaction avec le formulaire. Par exemple, j'ai une application qui prend un certain temps pour effectuer certaines tâches. Je fournis un indicateur de barre de progression pour ce travail particulier, mais vous pouvez toujours interagir avec l'application pour démarrer des tâches supplémentaires exécutées simultanément. Même si je ne vous autorisais qu'à effectuer qu'une seule tâche à la fois, vous souhaiterez peut-être afficher le fichier d'aide ou définir les préférences de l'application pendant l'exécution de la tâche. De plus, je donne à l'utilisateur un bouton qui lui permet d'arrêter la tâche. Désactiver le formulaire empêcherait ce type d’interaction.

Une autre possibilité consiste à "filtrer en sortie". toutes les entrées dans l'application. Cela pourrait être fait en écoutant le message "KeyDown". et "MouseButtonDown". Une fois le travail en arrière-plan déclenché, vous pouvez définir l'indicateur FILTER_INPUT sur true et le réinitialiser une fois l'opération terminée. Si l'indicateur FILTER_INPUT est défini, tous les événements de clé et de souris peuvent être annulés.

Ce n'est peut-être pas le plus efficace, car tous les KeyPress et tous les clics vont passer par la vérification du filtre.

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