J'ai une application C # qui enregistre son état lorsqu'elle est fermée, puis se lit dans l'état enregistré lorsqu'il démarre. Un élément enregistré est l'emplacement de la forme principale. Normalement, cela fonctionne bien - dans mon code, une ligne est une ligne comme celle-ci qui enregistre l'emplacement dans un fichier qui est ensuite lié dans le démarrage: occasionnellement, je verrai des coordonnées qui sont enregistrées comme ceci: p> puis Lorsque l'utilisateur apporte l'application sauvegardée, le formulaire éteint le bureau et ne peut pas (facilement) être récupéré par un utilisateur moyen. P> Que se passe-t-il pour que les coordonnées soient lues de cette façon et sont Il y a des suggestions pour empêcher cette situation? P> p>
3 Réponses :
Les coordonnées que vous voyez sont dues au fait que l'application est minimisée lorsqu'elle est fermée. Windows "masque" votre formulaire en le déplaçant de ses coordonnées à certains coordonnées x, y ridiculement importants.
vérifié programmatiquement: p>
sortie d'une application de formulaire sur Vista: P>
Coordonnées actuelles X: 184 Y: 184 * Emplacement par défaut à partir du code: P>
Coordonnées actuelles x: - 32000 strong> y: - 32000 strong> * Emplacement minimisé P> System.Diagnostics.Debug.WriteLine("Current coordinates X: " + Location.X + " Y: " + Location.Y );
Une meilleure solution consiste à conserver les coordonnées non minimisées en mémoire, puis à les sauvegarder quand il se ferme.
Comment détecterai-je les coordonnées non minimisées?
@Mark: où que vous placiez la logique, vous devez vérifier et décider si les coordonnées sont minimisées ou non.
Vérifiez Windowstate Enum: msdn.microsoft.com/fr- US / Bibliothèque / ...
Utilisez la propriété RestaOutBounds sur votre formulaire.
Edit: Voici une copie / pâte de certains de mes codes (pourrait probablement utiliser un peu de nettoyage, mais cela obtient le point). Cela vient de la formulaire de mon formulaire de ma forme principale Gestionnaire d'événements: p> et voici comment restaurer l'état sur charge (N'oubliez pas de définir le mode de position initiale de votre formulaire sur manuel pour éviter tout scintillement) : p>
Merci, Jon. Pouvez-vous me signaler à une URL l'explication sur la manière dont vous utilisez programme.appsettings? Je n'ai pas d'appsettings sous mon objet de programme.
C'est ma propre classe personnalisée qui gère les paramètres de l'application. Comme je l'ai dit, ce code était copié / collé directement de l'un de mes programmes.
C'est le moyen et le seul moyen de faire, d'empêcher le scintillement ou l'emplacement de la forme modifiée avant l'événement de spectacle. La deuxième partie du code doit être effectuée après i> initializecomonent () code> et avant i> l'événement Afficher, et comme JON mentionné, le STARTPOSITION CODE> Propriété du formulaire doit être définie sur FORMSARTPOSITION.MANUELLE CODE>, sinon certains paramètres peuvent être modifiés après avoir été défini (avant l'événement Afficher). Un fichier XML personnalisé peut être utilisé à la place des paramètres diaboliques pour éviter le schéma de dénomination de répertoire très gênant.
Répondre à la question principale " Qu'est-ce qui se passe fort>": p>
J'ai trouvé que cela a été facilement reproduit tout en appuyant sur Ctrl + D pendant que l'application est en cours d'exécution (= raccourci pour minimiser toutes les fenêtres et afficher le bureau). P>
Bien que votre fenêtre soit minimisée et que vous définissez à la place, vous devriez être réglé window.visible = false code> Vous obtiendrez les deux coords (haut, gauche) = -32000 code>. Cette tentative est incorrecte car la fenêtre est déjà minimisée (= cachée) et que vous modifiez les coordonnées. P>
window.showintaskbar = false code> qui est plus correct et le problème avec Coord -32000 Dissays. P>