2010-05-12 4 views
0

Je développe (en utilisant Silvelight 3) une application qui crée une sorte de ligne temporelle et y place des objets. Pour cela, j'ai besoin d'un très grand Canvas (jusqu'à 2000000 pixels de largeur) avec de longues lignes, mais chaque fois que je crée Canvas même 40000 pixels de largeur, il se comporte très étrangement, disparaissant aléatoirement.Problème avec une grande toile dans Silverlight

J'ai trouvé un message avec la description du même problème sur silverlight forums et un autre ici sur le stackoverflow. Il semble que c'est un problème connu depuis Silverlight 2, mais je ne trouve pas de bonne solution de contournement. Est-ce que quelqu'un sait une telle solution ou peut vérifier est-ce toujours un problème dans Silverlight 4?

Merci d'avance.

+1

Ne vaudrait-il pas mieux créer un contrôle personnalisé qui dessine la section suivante (ou précédente) de la timeline juste en dehors de l'écran (ou redessine la timeline) et gère un scroller personnalisé? – Lazarus

+0

C'était ma première idée quand j'ai découvert le problème. Mais alors j'ai pensé, peut-être qu'il y a une solution commune standard. – Fury

Répondre

1

L'une des réponses à la question SO mentionne le problème provient de la représentation de points

« Attention: la taille maximale d'une toile Silverlight est 32767 points de Ceci est parce que la taille. de UIElements ne sont pas stockées en tant que flotteurs comme dans WPF, mais en 32 quantité de bits dont 16 bits forment l'entier de la taille et 16 bits forment la partie flottante de celui-ci.

Il y a assez de précision mais pas assez de portée. Une solution possible consiste à mettre à l'échelle tous vos points dans la plage autorisée lorsque vous les ajoutez au canevas. Par exemple, diviser par 1024 ramènera vos 2000000 pixels à une valeur de ca. 2000, bien dans la gamme, et avec une prévision de 1/1024, c'est bien dans la précision aussi. (Nous ne faisons que déplacer la totalité de la valeur de 32 bits, partie intégrale et partie fractionnaire 10, donc pas de perte de précision, mais une plage accrue.)

Vous pouvez même créer un conteneur personnalisé qui effectue cette correspondance pour toi.

+0

Malheureusement, la mise à l'échelle est également l'une des tâches de mon application, c'est-à-dire que je dois être en mesure de modifier la chronologie de mise à l'échelle d'une seconde par 100 pixels. Donc ce n'est pas une solution dans mon cas. Mais merci pour votre réponse de toute façon. – Fury

+2

Je pense que vous mélangez la résolution d'écran de l'espace de coordonnées abstrait. Vous pouvez dessiner sur l'écran comme une transformation des coordonnées que vous utilisez. Essentiellement, les coordonnées sont dans votre espace de problème logique, et la présentation est un espace d'écran. Vous utilisez une transformation pour convertir votre espace logique en espace d'écran. Cela aborde à la fois vos problèmes, les grandes valeurs de coordonnées et l'échelle de présentation en une. Voir RenderTransform sur UIElement. – mdma

+0

"Je pense que vous mélangez la résolution d'écran de l'espace de coordonnées abstraites" En effet je le suis. Un grand merci pour ce conseil. J'ai déjà résolu mon problème particulier, mais je me souviendrai des transformations à venir. – Fury

Questions connexes