2009-11-30 3 views
2

J'ai besoin de calculer le Width de chaque UIElement dans un panneau personnalisé. Si une boucle sur Children:Comment définir DesiredSize.Width d'un UIElement?

foreach (UIElement child in Children) { ... } 

Je ne peux pas faire child.DesiredSize.Width = myCalculatedWidth; depuis DesiredSize et DesiredSize.Width sont en lecture seule.

Les docs disent que ce Measure() met à jour le DesiredSize du UIElement, alors j'ai essayé:

Size size = new Size(myCalculatedWidth, Double.PositiveInfinity); 
child.Measure(size); 

Mais child.DesiredSize.Width est inchangé. Comment définir le DesiredSize.Width?

Répondre

0

Essayez simplement avec child.Width = myCalculatedWidth.

+2

'UIElement' n'a pas de propriété' Width'. – d7samurai

1

Appelez InvalidateArrange(). Le système de rendu appellera le Arrange(Rect) et mettra à jour le DesiredSize de l'UIElement avec votre taille.

1

Si vous appelez directement Measure, il n'y a rien à faire pour le système de mise en page WPF (car il met en cache l'état des contrôles et le stocke comme des indicateurs comme MeasureIsValid). Vous devez appeler InvalidateMeasure() pour ce contrôle (qui marquera le contrôle comme MeasureIsValid = false) et UpdateLayout() ensuite de forcer la mise en page à être mis à jour.

1

Aucune des autres réponses a fonctionné pour moi. Ce que je devais faire était de mettre en œuvre MeasureOverride dans le contrôle des enfants

0

Impossible de modifier directement DesiredSize, car seul UIElement peut écrire dans DesiredSize, ce qui se produit dans UIElement.Measure(). Toutefois, Measure() ne calcule pas DesiredWidth, mais appelle MeasurementCore à la place. Mais même MeasurementCore ne calcule pas DesiredSize directement, mais utilise plutôt la valeur retunr de MeasurementOverride. de MeasurementOverride() pour changer DesiredChange :-)

Il ressemble à ceci:

UIElement.Measure() calls 
    FrameworkElement.MeasureCore() calls 
    YourControl.MeasureOverwrite() 

valeur de retour de MeasureOverwrite() devient la valeur de retour MeasureCore(), qui est ensuite stocké dans UIElement.DesiredSize.

Notez que la valeur retournée par MeasureOverwrite() n'est pas nécessairement la même que celle stockée dans DesiredSize, car la marge est ajoutée à la valeur retournée! FrameworkElement.MeasurementCore() s'assure également que DesiredSize est dans MinWidth, MaxWidth et Height, respectivement. Si la largeur ou la hauteur de la valeur renvoyée est infinie de isNaN, une exception est levée.

Questions connexes