2010-12-29 1 views
10

Comment suspendre et reprendre la mise en page dans WPF? J'ai entendu que ce n'est pas nécessaire. Mais c'est extrêmement nécessaire!Comment suspendre et reprendre la mise en page dans WPF?

Je traite beaucoup de positions de changement, et si elles sont rendues une par une, cela crée un effet de retard.

Voici un code:

 

CompositionTarget.Rendering += new EventHandler(Draw); 
void Draw(object sender, EventArgs e) 
{ 
    //Clean screen 
    for (int i = mainCanvas.Children.Count - 1; i > -1; i--) 
    { 
    if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image) 
    { 
      mainCanvas.Children.Remove(mainCanvas.Children[i]); 
    } 
    } 
    //DRAW FLOOR AROUND 
    FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id); 
    for... 
    { 
     Image image = new Image(); 
     image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative)); 
     mainCanvas.Children.Add(image); 
    } 

    //DRAW PLAYERS AROUND 
    //Its similar as draw floors around. 
    ... 
} 
 
+3

@Alan, avant de chercher des chasseurs de primes, prenez le temps d'ajouter plus d'informations à votre question. Quelqu'un pourrait trouver une meilleure solution. Vous allez devoir l'ajouter même pour les chasseurs de primes! :) – decyclone

+4

@Alan Votre problème n'est pas le manque de primes, c'est le manque de détails dans la question. Mon impression est que votre solution (suspension de la mise en page) n'est pas ce que vous voulez vraiment, donc les gens ont besoin de plus de détails pour trouver la racine de votre problème. – CodesInChaos

+0

C'est tellement simple, je l'ai déjà décrit. Pour les joueurs, c'est encore plus simple. – Seva

Répondre

7

Vous n'avez pas donné suffisamment d'informations, sauf pour dire que votre « traiter beaucoup de changements ». Mais si vous faites tous ces changements:

  • séquentiellement
  • du thread d'interface utilisateur
  • sans appeler UpdateLayout et
  • sans retourner

alors aucune mise en page se produit en bewteen ces changements . Par conséquent, il n'y a rien à suspendre ou à reprendre parce que la mise en page est toujours différée jusqu'à ce que vous reveniez de faire ce genre de changements. Par conséquent, si vous rencontrez des retards, alors ce n'est pas parce que vous ne modifiez pas votre mise en page par l'intermédiaire de WinForms. Par conséquent, la seule façon de réduire le délai, si elle est due à la mise en page, est d'éviter des recalculs de mise en page inutiles. Encore une fois, sans savoir ce que vous faites, il est impossible de suggérer quelque chose de concret. Mais il existe de nombreuses propriétés que vous pouvez éviter de déclencher un passage de mise en page récursif. Voir Considérations sur les performances de mise en page dans cet article:

+0

J'ai ajouté le code maintenant. Si vous pouviez voir, merci. – Seva

+0

Vous pouvez obtenir de bonnes performances avec les éléments WPF en tant que sprites, et vous pouvez même changer leur position sur chaque rendu pour obtenir la fréquence d'images la plus rapide possible. Vous avez juste besoin de réutiliser les éléments d'une image à l'autre et d'ajuster leur emplacement en changeant les champs d'une transformation de rendu, sans les recréer à partir de zéro à chaque cycle. –

+0

En développement de jeu, nous n'utilisons pas cette technique, car il est difficile de savoir quel objet a disparu de la fenêtre. – Seva

13

WPF est un moteur de composition retenue. Ce que cela signifie, c'est que vous n'avez pas besoin de faire le rendu vous-même accrocher l'événement Rendering, mais plutôt composez une image en utilisant des nœuds que vous mettrez dans un arbre. Voir ici pour plus de détails sur l'architecture WPF: WPF Architecture. Je peux vous assurer que si vous comprenez parfaitement ce document ainsi que le lien du système de mise en page envoyé par Rick Sladkey, vous devriez également comprendre pourquoi vous devriez changer votre code si vous voulez continuer avec WPF. Si vous jouez bien avec WPF (ie: utilisez les propriétés de dépendance, substituez la méthode & par exemple), vous verrez qu'il s'agit d'un moteur très puissant capable d'afficher des milliers de nœuds dans l'arbre graphique. Je suggère une autre lecture utile: ZoomableApplication2: A Million Items

0

Avez-vous envisagé d'enlever d'abord le canevas de la fenêtre qui le cacherait, puis d'effacer et de rajouter tous vos objets sur la toile, puis de rajouter la toile à la fenêtre?

+0

J'ai essayé, n'a pas fonctionné aussi. – Seva

Questions connexes