2016-04-20 96 views
0

我有一個ScrollViewer內的畫布。我想要做的是調整畫布的大小,使它可以填充ScrollViewer或包含其子元素 - 以較大者爲準。我所面臨的挑戰是,Canvas中的MeasureOverride總是被稱爲無窮大 - 我認爲這是有道理的(它在一個卷軸中,因此它可以是任何大小)。所以,雖然我知道畫布需要多少空間兒童,我不知道我的父母有多大 - 所以我不能返回最小尺寸(填充滾動視口)WPF畫布在ScrollViewer大小適合

任何見識將是最受歡迎的。

感謝

+0

您可以將'MinHeight'綁定到'ScrollViewer'的'Height'。例如'' – Blinx

回答

0

我所做的是綁定CanvasActualHeight S中ScrollViewerHeightMinHeightCanvas'內容。

由於CanvasHeight只應ScrollViewerHeight當內容的高度不,是有意義的這個設置爲CanvasMinHeight

<ScrollViewer Name="YourScrollViewer"> 
    <Canvas Height="{Binding ElementName=YourContent, Path=ActualHeight}" MinHeight="{Binding ElementName=YourScrollViewer, Path=ActualHeight}"> 
     <StackPanel Name="YourContent"/> 
    </Canvas> 
</ScrollViewer> 
+0

感謝您的建議。不確定它在我的情況下很有效。我的畫布內容是一些Visual對象(在代碼中創建),所以我需要以編程方式計算它們的邊界等。我的畫布也可以縮放 - 實際上我想確保它實際上是滾動視口的倍數(因此總是有滾動的餘量) – Scotty

+0

你可以在'MinHeight'上使用轉換器進行綁定以獲得倍數。對於'高度'我建議循環你的集合,並使用'Canvas.GetTop(Element)+ Element.ActualHeight'來獲得最大值,創建一個屬性來存儲這個然後綁定到'Height'上 – Blinx

+0

I'已經提出了一些黑客解決方案。我重寫ScrollViewer中的MeasureOverride並緩存約束大小,然後在Canvas上調用.Measure。在Canvas的MeasureOverride中,我然後返回父ScrollViewer緩存的約束大小(針對我的內容大小和任何縮放比例進行調整)似乎工作!? – Scotty