以下のようなXAMLがあります。解決できない問題は、ビューの完全なグリッド(固定高さ)の周りにラップしているスクロールビューアを持っていますが、ウィンドウサイズよりも長いコンテンツでスクロールバーを取得することができないということです。
ユーザーコントロールがウィンドウの高さいっぱいになるようにしたいのですが、グリッドコントロールの長さがウィンドウサイズより大きい場合は、スクロールできるようにしたいのです。しかし、スクロールビューアの高さを手動で設定しないと、スクロール可能なスクロールバーが表示されません(例では手動で設定)。
このサイトの他の例も見ましたが、有効な答えに出会えません (この リンク も含めて)。
XAML。
<UserControl d:DesignWidth="300" d:DataContext="{d:DesignInstance ViewModels:EntityViewModel}">
<StackPanel>
<Label Content=“text” />
<ScrollViewer Height="450" Width="250" VerticalScrollBarVisibility="auto">
<Grid>
<ItemsControl ItemsSource="{Binding Entities}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:EntityView DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</ScrollViewer>
</StackPanel>
</UserControl>
編集 簡単に再現できる追加の例を追加します。必要なのは、ドックパネル(グリッドでも可)がユーザーコントロールが挿入された画面に収まる以上のコンテンツを持っているときに、スクロールビューをスクロールできるようにすることです(つまり、スクロールビューアのサイズを固定することはできません')。
<Window Title="MainWindow" Height="200" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Label Content="title"/>
<ScrollViewer>
<DockPanel>
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
<Label DockPanel.Dock="Top" Content="title" HorizontalContentAlignment="Center" />
</DockPanel>
</ScrollViewer>
</StackPanel>
</Grid>
</Window>
垂直方向の Orientation を持つ StackPanel は、子要素の高さを制限しません。言い換えると、Scrollviewer は、明示的に高さを設定しない限り、常にコンテンツ全体を表示するのに必要な高さと同じ高さになります。
グリッドやDockPanelなど、別のパネルを選択する必要があります。
<UserControl ...>
<DockPanel>
<Label DockPanel.Dock="Top" Content="text"/>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Entities}">
...
</ItemsControl>
</ScrollViewer>
</DockPanel>
</UserControl>
StackPanelに
ScrollViewer` を設定してみてください。
<ScrollViewer Height="450" Width="250" VerticalScrollBarVisibility="auto">
<StackPanel>
<Grid>
<ItemsControl ItemsSource="{Binding Entities}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:EntityView DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</StackPanel>
</ScrollViewer>