wpf utilisation de MeasureOverride ArrangeOverride
bonsoir,
je suis en train de développer mon propre "Panel" et pour ce faire je dois utiliser les méthodes MeasureOverride er ArrangeOverride.
A travers la lecture de différents articles j'ai compris que la première méthode est destinée à obtenir des "Children" la taille demandée, puis la seconde méthode leur impose la taille d'affichage
Il semblerait qu'en fonction de la disposition des enfants dans le panel le contenu du code serait différent. de plus dans la méthode MeasureOverride on passe en paramètre entrée un "Size" D'où provient il?
doit on créer des event pour lancer ces méthodes ou bien sont elles appelées automatiquement
Je suis vraiment perdu avec ces méthodes
Je compte encore une fois de plus sur vous
Par avance merci
MeasureOverride,ArrangeOverride
bonjour terrible,j'attire ton attention sur une chose dans :
1/MeasureOverride d'un Panel
- un control panel octroie toujours la taille desiree a ses enfants.
- la taille des ses enfants est une contrainte pour lui(car leur taille depend de leur contenu c'est pour cela qu'ils ont mis "desiredsize",exemple : si tu y mets un grid avec des hauteurs ou des largeurs fixes).
Ceci parait conforme au bon sens et c'est une des souplesse du panel.
(si quelqu'un cree un control dockpanel il doit tenir compte en plus de la propriete dock des enfants,un controle viewbox considere availablesize comme infini)
c'est pour cela que tu seras tente d'ecrire ,si la variable total de type Size represente le cumul des desired.width et desired.height des enfants :
Code:
1 2 3 4 5
| If availableSize < new size(total.Width,total.Height) Then
return availableSize
Else
return New Size(total.Width,total.Height)
End If |
maintenant si jamais ton controle est heberge dans un stackpanel ou un viewbox alors "availablesize.width = double.Infinity" et "avalaiblesize.Height=double.Infinty"
c'est pour cela qu'il faut modifier ton test pour tenir compte de ce piege:
Code:
1 2 3 4 5 6 7 8 9 10 11
| If (Not Double.IsInfinity(availableSize.Width)) Then
If (availableSize.Width < total.Width) Then
total.Width = availableSize.Width
End If
End If
If (Not Double.IsInfinity(availableSize.Height)) Then
If (availableSize.Height < total.Height) Then
total.Height = availableSize.Height
End If
End If
Return total |
Ceci permettra d' avoir la taille idoine.
(il y a d'autre controles windows qui ont dans avalaiblesize.Height ce double.Infinty )
Dans ArrangeOverride il ne fera que placer ses enfants conforment à la "logique du type de panel" (stackpanel,dockpanel ou autre heritage)
Il faut comprendre measureoverride comme un interrogation posee au control panel pour lui demander s'il peut honorer la "constraint availablesize" sinon il utilise la taille necessaire à ses enfants.
Dans ArrangeOverride il ne fera que placer ses enfants conforment à la "logique du type de panel" (stackpanel,dockpanel ou autre heritage)
L'utilite de ArrangeOverride est ailleurs que dans la taille .Ils ont en vue par exemple de disposer les enfants en forme circulaire ou semi-circulaire(cercle inscrit dans le rectangle total ci-dessus).
2/ quand il s'agit de controle type graphique on peut imposer une taille au canvas tenant compte de la taille et position de ses enfants( shapes ou des objets visualdrawing) par exemple :
- boucle sur les enfants avec
Code:
1 2 3 4 5
| maxBottom= Math.Max(maxBottom,GetTop(child) +child.DesiredSize.Height)
maxTop= Math.Max(maxTop,GetTop(child) +child.DesiredSize.Width)
If double.IsNaN(maxBottom) or double.IsInfinity(maxBottom) then
maxBottom = 0D
End If |
idem pour maxTop
Code:
return New Size(maxBottom, maxTop).
- la il faut evidemment implementer le scrolling et le zoom et gerer des viewports pour afficher les enfants car le nombre des enfants depend de l'utilisateur.
Prends garde d'utiliser le scrolling des enfants si c'est des types UI (tres mauvais effet d'avoir des boutons,des textbox qu'il faut scroller pour les voir).
bon code....