2010-02-17 11 views
3

J'ai un contrôle personnalisé WPF qui prend parfois du temps à rendre dans certains scénarios complexes. J'aimerais pouvoir indiquer à mon contrôle personnalisé d'afficher une image d'espace réservé (par exemple, "Veuillez patienter - rendu!"), Puis de restituer le contrôle au moment de l'inactivité (une fois l'entrée traitée).Retarder le rendu d'un contrôle personnalisé dans WPF

Je pense à la modification de mon contrôle personnalisé pour contenir une grille parente et deux enfants: A) une image d'espace réservé et B) le contenu réel. Par défaut, A) est visible et lorsque la visibilité du contrôle personnalisé change, je pourrais BeginInvoke un délégué qui montrerait à son tour B) au lieu de A).

S'il y a plusieurs/plusieurs de ces instances de contrôle sur l'écran, il est à espérer qu'elles ne bloqueront pas le thread principal tout en les affichant toutes simultanément. Étant donné que les délégués sont placés en file d'attente avec une priorité inférieure à la priorité d'entrée, l'interface utilisateur devrait en théorie rester très réactive.

Est-ce que quelqu'un a déjà rencontré un problème similaire?

Répondre

1

Oui, cette approche fonctionnera bien et je l'ai utilisée à plusieurs reprises.

Généralement, j'utilise cette approche si le contrôle doit extraire et/ou traiter des données avant le rendu. Je recommande de faire tout ce travail sur un thread d'arrière-plan, puis d'appeler la mise à jour de rendu réelle en utilisant le Dispatcher de l'élément. Astuce: Je vais souvent déclarer un DP interne appelé quelque chose comme Revision de type int et l'enregistrer avec AffectsRender. Ensuite, une fois que le thread d'arrière-plan a effectué son traitement lourd, BeginInvoke() peut appeler pour incrémenter la propriété Revision, invalidant ainsi le rendu et provoquant un nouveau rendu. Vous pouvez ensuite exécuter la logique de rendu appropriée dans votre remplacement OnRender, comme d'habitude.

Questions connexes