2015-07-22 31 views
0

我正在寫MeasureOverride實現,有一點我堅持。 函數的返回值。 這是代碼。WPF MeasureOverride返回值

protected override Size MeasureOverride(Size availableSize) 
{ 
Double cHeight = 0.0; 
Double cWidth = 0.0; 
Size size = new Size(0, 0); 

foreach (UIElement child in InternalChildren) 
{ 
    child.Measure(new Size(availableSize.Width, availableSize.Height)); 
    if (child.DesiredSize.Width > cWidth) 
    { 
     cWidth = child.DesiredSize.Width; 
    } 
    cHeight += child.DesiredSize.Height;  
} 

size.Width = double.IsPositiveInfinity(availableSize.Width) ? size.Width : cWidth; 
size.Height = double.IsPositiveInfinity(availableSize.Height) ? size.Height : cHeight; 

return size; 
} 

我的理解是返回一個空的Size對象表明元素將使用所有可用的空間。然而,在這種情況下,當可用空間是無限正數時,它將返回零。 它應該不是其他方式。當無限空間可用時,只使用子元素所需的空間?否則,限制自己使用任何可用的空間?

size.Width = double.IsPositiveInfinity(availableSize.Width) ? cWidth : availableSize.Width; 
size.Height = double.IsPositiveInfinity(availableSize.Height) ? cHeight : availableSize.Height; 

回答

1

這是一個很難回答。這取決於你想達到什麼。 也許你知道測量階段只確定所需的尺寸。然後排列階段與最終值擺弄。

我可以想象與行爲面板如在上面的代碼。它可以避免父ScrollViewer保留太多的空間,以防我們的面板的孩子需要非常多的空間(例如,因爲它是一個擁有多個項目的ItemsControl)。通過返回零,周圍的ScrollViewer不會保留這個空間,在安排階段,我們的面板可以根據需要佔用空間,儘管我們返回了零。

這將是一個非常特殊的情況,但我今天張一兵同志商榷這個問題非常具有collegue當他沿的ScrollViewer內的其他元素一個DataGrid。

沒有在「安排」的代碼,這是所有投機性的,但它的這種代碼的可能用途。

1

用的MeasureOverride,您要退回您的控件想成爲大小。如果MeasureOverride被賦予了無限界限,那麼你可以使其成爲保存所有孩子的大小;它是由你決定。另一方面,如果你返回的尺寸大於給定的尺寸,那麼你的控制父母可能會接受並稍後切斷你的控制。例如,如果您的控件位於一個網格中並且網格寬度設置爲500,則您的MeasureOverride函數將傳遞一個可用寬度500.您可以返回600作爲寬度,並且您將在ArangeOverride函數中獲得600寬度,但是父網格仍然只能控制500的寬度,而你的內容只會被切斷。

我想這與WinRT中(8.1的Windows Store應用)寫我自己PriorityStackPanel控制和我描述它的工作。我認爲WPF在這種情況下幾乎完全相同。

在WinRT中,沒有「空」大小對象。大小對象將爲其設置一些值。 NAN和PositiveInfinity都會導致異常,因此您應該返回您希望控制的大小。你如何選擇這個大小取決於你,但它不可能是「你可以爲我決定的:像一個空的大小對象(在WinRT中)的價值。即使你可以在WPF中返回它,我建議它反對它,因爲它使代碼不太清楚,只要返回給定的可用大小(如果這是您需要的)。如果您需要更多空間,請返回更大的大小,但如果您要求,不要指望容器顯示所有內容比給它更多的空間。