2010-02-08 2 views
0

J'ajoute des contrôles à une programmation toile qui est tout simplement merveilleux ...Possibilité de modifier dissapears de contrôle en l'absence de propriétés sont définies

var newControlPoint = new ControlPoint() { Width = 10, Height = 10 }; 
newControlPoint.SetResourceReference(Control.TemplateProperty, "ControlPoint"); 
SetCanvasPosition(newControlPoint, position.X - (newControlPoint.Width/2), position.Y - (newControlPoint.Height/2)); 
canvas.Children.Add(newControlPoint); 
newControlPoint.UpdateLayout(); 

... mais je viens décollée lorsque je tente de retirer la largeur et les paramètres Hauteur câblées de la première ligne ...

var newControlPoint = new ControlPoint(); 

... le positionnement de la toile ne semble pas prendre effet et les vents de contrôle nouvellement créé jusqu'à à {0,0}.

Des idées?

Répondre

0

Deux problèmes:

  1. La largeur et Height ne seront pas réglées parce que vous ne les avez pas explicitement défini. C'est ActualWidth et ActualHeight que vous voulez, qui sont définis par WPF.
  2. Les contrôles n'ont pas encore été définis, alors ActualWidth et ActualHeight seront zéro.

Pour contourner le problème, vous pouvez:

  1. Utiliser databinding au lieu de faire un calcul unique.
  2. Reliez la logique de positionnement à l'événement Loaded de la commande afin qu'elle soit positionnée.
  3. Utilisez Dispatcher.BeginInvoke pour exécuter la logique de mise en page dans un message distinct dont la mise en page est moins prioritaire, ce qui garantit que les valeurs ActualWidth et ActualHeight ont été calculées et affectées.
+0

En fait, je ne voulais pas du tout définir la largeur et la hauteur du code. Ce sont mes tentatives de supprimer un tel code qui a révélé les problèmes pour moi. Une fois que j'ai enlevé la division de la largeur et de la largeur, tout a recommencé à fonctionner. Il y avait probablement une exception, mais Visual Studio ne donnait pas la moindre indication que quelque chose n'allait pas (jusqu'à et y compris pouvoir franchir et dépasser le code incriminé). – lzcd

+0

Et comme quelqu'un d'autre l'a fait remarquer tout à l'heure, tout le comportement étrange peut être expliqué par la hauteur et la largeur de NaN. par exemple. x + NaN/y = NaN. – lzcd

Questions connexes