2010-04-30 4 views
4

Je suis en train de gérer une application Windows CE construite avec le .NET Framework qui contient environ 45 formulaires. Il y a 5 'sections' qui mènent à la fonction que vous voulez. L'application est 100% en plein écran et il est important qu'elle ne puisse pas être minimisée.Bonnes pratiques de Compact Framework: création d'une interface graphique

Étant donné qu'il y a tellement de formulaires, il est difficile de garder une trace de la forme à afficher après la fermeture. Pour cela, je définis la propriété du propriétaire du formulaire avant de l'afficher et montre le propriétaire lors de la fermeture.

J'ai également été informé qu'il est préférable d'instancier tous les formulaires lors du chargement de l'application et de ne pas les éliminer pour économiser du temps de traitement. Je ne suis pas sûr de cela.

Ma question est la suivante: quelle est la meilleure façon de montrer, en cachant des formulaires où vous voulez qu'un formulaire soit devant, en plein écran tout le temps?

Répondre

3

Je n'irais pas sur la méthode d'instanciation de 45 formulaires au démarrage de l'application. Cela augmenterait considérablement le temps de démarrage et, si ce n'est probablement, épuiserait vos ressources mémoire, pour fournir des fonctionnalités dont votre utilisateur n'a peut-être même pas besoin.

Dans mes applications WinMo, chaque formulaire est conçu pour fonctionner avec un sous-ensemble de données relativement petit. Le temps de démarrage est donc limité aux appels de base de données et au chargement des données dans les contrôles du formulaire. Généralement, le temps requis pour instancier l'une de ces formes et montrer qu'il n'est jamais plus d'une seconde ou deux. Si vos formulaires sont plus longs à afficher, il est possible que votre récupération de données ou la façon dont les données sont chargées dans les contrôles du formulaire posent un problème (par exemple, vous pouvez avoir un contrôle gridview personnalisé qui rend entièrement 300 lignes même si seulement 12 sont visibles en même temps). Si vos données sont si volumineuses qu'elles prennent légitimement beaucoup de temps à être récupérées, il y a de fortes chances que ce soit beaucoup plus de données qu'un utilisateur puisse pratiquement interagir de toute façon.

Je suppose que votre mention de "5 sections" pour obtenir où l'utilisateur doit aller signifie qu'ils pourraient (au maximum) être "percer" 5 niveaux à quelque chose. Si vous implémentez cela en faisant instancier chaque formulaire et que vous affichez le formulaire suivant en utilisant ShowDialog, vous auriez au maximum 5 à 6 formulaires existant à la fois, ce qui ne devrait poser aucun problème pour une application .Net CF (je fais ceci tout le temps). De cette façon, vous n'avez rien de spécial à faire pour savoir quel formulaire doit être affiché lorsque - vous ouvrez simplement un formulaire depuis n'importe où, et lorsque le formulaire est fermé, vous revenez automatiquement au formulaire d'appel.

Il y a une certaine bizarrerie de z-order/task manager que vous avez à traiter, mais ce n'est pas particulièrement compliqué. Avant d'appeler le ShowDialog sur le formulaire enfant, définissez la propriété Text du formulaire parent sur une chaîne vide, puis redéfinissez-la sur la légende d'origine du formulaire après les retours ShowDialog. Ce n'est pas strictement nécessaire, mais dans Windows Mobile (au moins jusqu'à la version 6) tous les formulaires .Net ouverts (avec une propriété Text non vide) apparaissent dans la liste des programmes en cours d'exécution, même s'ils proviennent tous du même application. En général, j'aime que mes applications multi-formulaires apparaissent comme un seul programme, donc je règle généralement le Text de chaque formulaire au nom de l'application).

J'ai également expérimenté avec une application à formulaire unique qui implémente chaque élément de l'interface utilisateur en tant que UserControl au lieu d'un formulaire, puis crée et empile les contrôles comme si vous créiez et ouvriez des formulaires. Cela fonctionne mais c'est un hack et je ne le recommande pas. Les formulaires ont un événement Load et UserControls non, ce qui constitue le problème principal.

+1

Ah, mais si vous utilisez un framework autour de ces UserControls, vous pouvez créer votre propre événement Load. – ctacke

+0

Bah, je n'utilise même plus de * contrôles * - je viens juste de "BitBlt" à l'écran. :) – MusiGenesis

+0

Oh, j'ai un formulaire avec 47 UserControls pour les vues. Mais la chose intéressante est que j'ai un seul contrôle personnalisé qui est utilisé pour afficher * chaque * élément d'interface utilisateur sur chaque vue. Pour obtenir l'alphablending dont j'avais besoin, je me suis contenté de faire un "swiss army swiss", de l'assembler avec de la peinture personnalisée et d'abandonner tout le reste dans la boîte à outils. Ah les joies du développement des FC. – ctacke

3

Il y a toute une charge de variables dans le processus, il n'y a donc pas de méthode unique. Bien sûr, le chargement initial de tous les formulaires signifie que la navigation inter-pages est rapide, mais elle ralentit le chargement et peut également vous faire manquer de mémoire.

Ma méthodologie générale est d'utiliser un cadre - Personnellement, je suis un fan du OpenNETCF IoC framework, mais je suis probablement biaisé.

En tout état de cause, vous avez besoin d'un cadre général qui fait deux choses:

  1. Sépare les vues du modèle (que ces vues devraient être FORMULAIRES, CFontrols de l'utilisateur, des panneaux ou tout ce qui est tout à fait discutable).
  2. pistes Voir c'est à l'avant et qui devraient être, « suivant » (si vous vous déplacez formaward ou arrière)

je l'ai fait un article simple cadre sur ce ages ago for MSDN. Je l'ai mis à jour pour utiliser un MVC séparé plus pur et le framework IoC more recently. Cela ne veut pas dire que mon chemin est le seul moyen, ou même le «juste» chemin. Cependant, c'est une méthodologie que j'ai trouvée réussie dans plusieurs déploiements, à la fois sur le bureau et sur les périphériques.

Il est difficile de vous donner des suggestions plus pointues que cela parce que nous n'avons aucune idée de vos besoins ou de vos limites. Si vous utilisez un périphérique ARM lent avec une mémoire et des charges graphiques très limitées, j'attaque certainement certaines choses différemment (mise en cache, chargement paresseux, etc.) qu'un appareil embarqué x86 de classe Pentium avec un chargement de RAM.

EDIT

Vous verrez que la différence entre la façon dont MusiGenesis et j'attaquer ce fait ressortir le fait qu'il n'y a pas de « droit ». Au moment où nous parlons, je fais du code pour une application intégrée en plein écran qui a 47 vues et le projet contient un et un seul formulaire. Il utiliserait probablement 47 Formes différentes. Les deux font le travail. Le point commun est que nous avons tous les deux une forme d'infrastructure sous-jacente qui traite de tout ce qui est nécessaire pour savoir ce qui est supposé être au sommet. Il se fie à ShowDialog pour afficher l'ordre z natif de Forms. Je compte sur un cadre personnalisé qui me rappelle d'où tu viens.

Encore une fois, cela ne fait que souligner qu'il n'y a pas de bonne ou de mauvaise - tant que cela répond aux exigences du projet.

+0

En fait, * I * ferait votre chemin si je partais de zéro. Ma méthode est un hack qui est sûr de rompre avec une nouvelle version de Windows Mobile (en supposant qu'il y aura de nouvelles versions). Cependant, cela pourrait être un peu plus facile pour un débutant, car cela ressemble plus à une programmation Windows régulière (si c'est une bonne chose). – MusiGenesis

Questions connexes