2009-11-30 68 views
2

我需要在自定義面板中計算每個UIElementWidth。如果遍歷Children如何設置UIElement的DesiredSize.Width?

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

我不能這樣做,因爲child.DesiredSize.Width = myCalculatedWidth;DesiredSizeDesiredSize.Width是隻讀的。

的文檔說是Measure()更新UIElementDesiredSize,所以我嘗試:

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

child.DesiredSize.Width不變。我如何設置DesiredSize.Width

回答

0

試試child.Width = myCalculatedWidth

+2

'UIElement'沒有'Width'屬性。 – d7samurai

1

致電InvalidateArrange()。渲染系統將調用Arrange(Rect)並用您的尺寸更新UIElement的DesiredSize

1

如果直接調用Measure,則WPF佈局系統無法做到這一點(因爲它緩存了控件的狀態並將其存儲爲諸如MeasureIsValid之類的標誌)。你應該叫InvalidateMeasure()此控制(這將標誌着控制爲MeasureIsValid = false)UpdateLayout()然後迫使佈局進行更新。

1

其他答案都不爲我工作。我需要什麼做的是在孩子的控制來實現MeasureOverride並在其中實現所需的佈局行爲

0

不能直接更改DesiredSize,因爲只有UIElement可以寫入DesiredSize,這發生在 UIElement.Measure()中,但Measure()不計算DesiredWidth,而是調用MeasurementCore 。但是即使MeasurementCore不直接計算DesiredSize,而是使用MeasurementOverride的retunr值,這就是你必須重載的原因德MeasurementOverride()來改變DesiredChange :-)

它看起來像這樣:

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

MeasureOverwrite的返回值()成爲的MeasureCore(),然後存儲在UIElement.DesiredSize的返回值。

請注意,MeasureOverwrite()返回的值不一定與DesiredSize中存儲的值相同,因爲邊距會被添加到返回值中! FrameworkElement.MeasurementCore()還可以確保DesiredSize分別在MinWidth,MaxWidth和Height內。如果返回值的寬度或高度isNaN是isNaN,則拋出異常。

相關問題