|
WPFのレイアウトシステムについて考える必要がありそうです。
WPFでは、計測と配置の2パスで各要素のレイアウトを行います。
どちらもルート要素(Window)から子孫要素に向けて再帰的に行われます。
・計測パス
各要素がどのぐらいの大きさを必要としているかを計測します。
親要素は
「自分はこれだけのサイズを提供できるが、あなたはどれだけのサイズを必要としているか?」
を子要素に問い合わせます。
問い合わされた子要素は、自分に子要素がある場合はさらにそれらに問い合わせたうえで、
自分(およびその子孫要素)が必要とするサイズを計算します。
・配置パス
実際に各要素を配置していきます。
親要素は
「あなたを表示するサイズは計測によってこう決まった。あなたの子要素を配置して」
と要請します。
子要素は、自身が持っている子要素をそれぞれ特定座標に配置していきます。
ScrollViewerは自分の大きさがWidth/Heightなどによって定義されていない場合、
子要素が必要とする大きさが自分の(コンテンツ領域の)大きさになります。
計測パスにおいて親要素から提示されたサイズを参照して、自分が必要とする大きさが
それよりも大きくなる場合(100x100しか親から提供されないのに自分が必要なのは200x200だった)、
スクロールバーの表示が必要になるなと判断したりします。
さて、親要素がCanvasの場合、計測パスで子要素への問い合わせに渡す大きさは「無限大」です。
なので、ScrollViewerは決して親要素であるCanvasより大きいサイズが必要になることはなく、
必然的にスクロールバーの表示も必要なくなります。
ということで、親がCanvasであるなら、ScrollViewerにはなにがしかの方法で自身のサイズを
定義する必要があります。具体的にはWidth/Heightを定義することです。
直値で設定するとウィンドウサイズの変更に追従できなくて困るというのであれば、
バインディングを使用して他の要素のサイズに追従するように作ることになるでしょう。
例えば、
<Canvas x:Name="root">
<ScrollViewer Width="{Binding Path=ActualWidth, ElementName=root}"
Height="{Binding Path=ActualHeight, ElementName=root}">
|