2009-07-31 4 views
11

Je développe une application Silverlight 3 et obtenir cette erreur vraiment étrange lorsque j'essaie d'ajouter un objet à un canevas. Mon code est le suivant:Children.Add (valeur d'objet) valeur ne se situe pas dans la fourchette attendue

for (int i = 0; i < person.Children.Count; i++) 
{ 
    //Add children in same position as parent 
    Person child = person.Children[i]; 
    child.x_PositionTransform.X = person.x_PositionTransform.X; 
    child.x_PositionTransform.Y = person.x_PositionTransform.Y; 
    child.Click += new RoutedEventHandler(person_Click); 
    x_LayoutRoot.Children.Add(child); 
} 

La première fois que j'utilise ceci, cela fonctionne comme prévu. Toutefois, lorsque je clique sur x_LayoutRoot.Children.Add (enfant) après avoir cliqué sur un objet Person créé à l'aide de ce code, j'obtiens une exception ArgumentException qui m'indique que "la valeur ne correspond pas à la plage attendue".

Cependant, lorsque j'ajoute le code suivant avant d'ajouter un enfant à x_LayoutRoot.Children, le problème disparaît.

child.SetValue(Canvas.NameProperty, "child" + objCount++); 

Pourquoi cela se produit-il? Est-ce un bug Silverlight, ou (plus probablement) suis-je juste manquer quelque chose?

+0

vous pouvez utiliser FrameworkElement.NameProperty au lieu de Canvas.NameProperty –

Répondre

24

Je pense que j'ai trouvé la cause de ceci: J'ajoutais plusieurs objets de personne avec le même nom. Donc, si quelqu'un a ce problème à l'avenir, assurez-vous que tous vos objets ont des noms uniques!

+0

eu le même problème à plusieurs reprises et je suis en train de mettre comme la cause la plus probable de NullReferenceExceptions sur un appel '... Children.Add (obj)'. – JeroenEijkhof

1
Person child = person.Children[i]; 
child.x_PositionTransform.X = person.x_PositionTransform.X; 
child.x_PositionTransform.Y = person.x_PositionTransform.Y; 
child.Click += new RoutedEventHandler(person_Click);   

child.SetValue(Canvas.NameProperty, "child" + objCount++); //! 

x_LayoutRoot.Children.Add(child); 

vous pouvez ajouter différents NameProperty avant d'ajouter un enfant

Questions connexes