2016-04-20 11 views
0

Ich habe ein Canvas in einem ScrollViewer. Was ich versuche, ist die Größe der Leinwand so, dass sie entweder den ScrollViewer füllt ODER die untergeordneten Elemente enthält - je nachdem, welcher Wert größer ist. Die Herausforderung, die ich habe, ist, dass MeasureOverride im Canvas immer mit Unendlich aufgerufen wird - was ich für sinnvoll halte (es ist in einem Scroller, also kann es jede beliebige Größe haben.) Ich weiß also, wie viel Platz die Leinwand benötigt Kinder, ich weiß nicht, wie groß mein Elternteil ist - also kann ich keine Mindestgröße zurückgeben (um das Scroller-Ansichtsfenster zu füllen)WPF Canvas in ScrollViewer-Größe passend für

Jeder Einblick wäre sehr willkommen.

Dank

+0

Möglicherweise können Sie die 'MinHeight' an die' Height' von 'ScrollViewer' binden. Etwas wie '' – Blinx

Antwort

0

Was ich getan habe, ist die Height und MinHeight ein Canvas die ActualHeight s der ScrollViewer und den Canvas' Inhalt binden.

Als Height der Canvas nur sollte die Height der ScrollViewer sein, wenn die Höhe des Inhalts ist weniger, ist es sinn dies der Canvas zum MinHeight einzustellen macht.

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

Danke für den Vorschlag. Nicht sicher, dass es in meiner Situation funktioniert. Mein Canvas-Inhalt ist ein Haufen Visual-Objekt (im Code erstellt), also muss ich programmatisch ihre Grenzen berechnen usw. Die Leinwand, die ich habe, könnte auch skaliert werden - und in Wirklichkeit möchte ich sicherstellen, dass es tatsächlich ein Vielfaches des Bildlauffensters ist Es gibt immer einen Rand zum scrollen) – Scotty

+0

Sie könnten einen Konverter für die Bindung auf 'MinHeight' verwenden, um ein Vielfaches zu erhalten. Für die "Höhe" würde ich vorschlagen, Ihre Sammlung durchzublättern und 'Canvas.GetTop (Element) + Element.ActualHeight' zu verwenden, um den maximalen Wert zu erhalten, eine Eigenschaft zu erzeugen, um diese zu speichern und dann diese an die' Höhe' zu ​​binden – Blinx

+0

I ' Ich habe mir ein bisschen eine Hack-Lösung ausgedacht. Ich überschreibe MeasureOverride im ScrollViewer und cache die Constrain-Größe, dann rufe ich .Measure im Canvas auf. In der MeasureOverride des Canvas-Bereichs gebe ich dann die übergeordnete ScrollViewer-Cached-Contrain-Größe zurück (angepasst an meine Inhaltsgröße und jede Skalierung usw.). Scheint zu funktionieren!? – Scotty