2009-09-11 14 views
1

Je travaille sur une application WPF et l'interface utilisateur devient un peu complexe à gérer. Je cherche des conseils sur la façon de l'entretenir à mesure qu'elle grandit.WPF: UI Composition

La mise en page ressemble à ceci

<Grid> 
    <List of Objects View/> 
    <Objects Relationship View/> 
    <Object Details View /> 
    <Multiple Objects Details View/> 
    <View 5 /> 
    <View 6 /> 
    : 
    : 
</Grid> 

Chaque vue est créé (caché la visibilité) et liée à des données complexes, lorsque la fenêtre est construite. Je veux qu'une seule vue soit visible, à la fois pour l'utilisateur. Je fais cela en manipulant la visibilité.

Mais le problème est que la transition entre les vues ne consiste pas simplement à retourner la visibilité. Cela implique une reliaison avec currentdata, l'arrêt des threads/timers d'arrière-plan et le démarrage de nouveaux threads (et éventuellement de nouvelles liaisons) prenant en charge la nouvelle vue sélectionnée. Donc, avec chaque nouvelle vue que j'ajoute, j'ajoute un tas de code pour prendre en charge toutes les transitions possibles.

Y a-t-il un modèle que je peux utiliser pour faire face à ce genre de scénario?

De même, y a-t-il un moyen d'éviter de créer et de masquer tout à la charge de l'application et d'utiliser la visibilité en tant que contrôleur?

Toute aide est grandement appréciée. Merci!

Répondre

2

Puis-je vous demander comment vous permettez à l'utilisateur de basculer entre les vues? Est-ce un combo clé? Clic de souris?

Ce n'est pas que cela réponde à votre question en soi, mais je suggère que cela ressemble à un scénario parfait pour un contrôle de tabulation. Et avec WPF, il ne doit pas nécessairement ressembler à un contrôle de tabulation. Si vous utilisez un TabControl, cela ouvre la possibilité d'utiliser l'événement SelectionChanged provenant de TabControl pour vous permettre de dire aux threads d'arrière-plan de s'arrêter et de décharger tout ce que vous avez besoin de décharger. Selon l'utilisation du TabControl, l'interface utilisateur peut être quelque peu virtualisée. Cela signifie que chaque fois qu'un onglet n'est pas sélectionné, toute l'interface utilisateur de cet onglet est détruite et recréée la prochaine fois qu'elle est sélectionnée. Il se comportera de cette façon si vous utilisez le modèle MVVM ou PresentationModel et chargez ViewModels comme éléments pour votre TabControl et utilisez DataTemplates pour les vues. Si vous mettez simplement TabItems dans le TabControl avec des contrôles à l'intérieur d'eux, il ne se comportera pas de cette façon, cependant. En ce qui concerne les modèles, je recommanderais certainement MVVM. Cela peut prendre un peu de temps pour le rattraper et le comprendre, mais je ne ferais jamais WPF sans cela. Si vous avez besoin de plus de ressources ou d'exemples, faites le moi savoir.

modifier:

Je relisez votre question et a remarqué que vous pouvez avoir besoin d'un autre type de navigation. Si vous avez des vues qui doivent effectuer des transitions vers d'autres vues en fonction des actions de l'utilisateur et que vous ne souhaitez pas que toutes les vues soient présentées à l'utilisateur afin qu'elles puissent sélectionner celles qu'il souhaite voir (comme les TabControl fera), vous pouvez regarder WPF Navigation. La navigation est essentiellement quelque chose que MS a ajouté à WPF pour permettre la navigation de style navigateur dans une application WPF. This MSDN article devrait être une bonne ressource sur ce genre de chose.

+0

D'un côté, l'utilisation de TabControl signifierait que vous n'avez pas besoin de modifier la propriété Visibility sur toutes ces vues. Yuck. – dustyburwell

+0

Merci ascalonx! Ceci est utile Avez-vous des liens vers des exemples de code? Je dois revoir le tabcontrol (il y a un moment et je ne l'ai pas acheté). Voulez-vous dire que la logique de transition va dans le gestionnaire SelectionChanged? Aussi pourriez-vous s'il vous plaît clarifier pourquoi mettre "TabItems dans le TabControl avec des contrôles à l'intérieur d'eux" ne fonctionne pas? Actuellement, la transition de l'utilisateur entre les vues est obtenue par une combinaison de clics ou de clics de bouton menuitem dans la vue elle-même. – Sharun

+0

Yuck a raison! Malade de renverser ces valeurs partout. – Sharun

1

Cela ressemble à un problème bien adapté à Composite WPF (Prism). Vous pouvez définir votre zone principale en tant que région et utiliser SingleActiveRegion pour afficher une vue à la fois.Si vous créez votre propre adaptateur de région, vous pouvez effectuer toute la maintenance lorsque la vue active est modifiée. De plus, l'ajout d'une nouvelle vue n'implique pas de modifier le code de la vue d'hébergement. Cela vous permettra de déployer des vues supplémentaires à l'avenir dans des assemblages séparés ...