Ответ 1
Если вы удаляете Height из своего GroupBox (который, насколько я понимаю, это то, что вы хотите сделать), то он заполнит свой контейнер, если не будет панели вверх по течению, которая накладывает свои собственные правила калибровки.
Я использовал эту упрощенную версию вашего XAML. Я удалил шаблон и привязку, а также жестко закодированные некоторые элементы, чтобы сделать это отдельно; эти изменения не повлияют на способ компоновки.
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<GroupBox FontWeight="Bold" Header="Tables" Padding="2">
<ScrollViewer>
<ItemsControl FontWeight="Normal">
<TextBlock>Foo</TextBlock>
<TextBlock>Bar</TextBlock>
<TextBlock>Baz</TextBlock>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</Window>
Запустите его, и вы увидите, что содержимое действительно имеет размер, соответствующий окну, и полоса прокрутки разрешает только тогда, когда окно становится слишком маленьким, чтобы видеть все три элемента. Я считаю, что это то, что вы хотите.
Таким образом, проблема, скорее всего, является одной из родительских панелей, которую вы не показываете в своем примере XAML. Описанная вами проблема может возникнуть, если ваш GroupBox появится внутри StackPanel:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<StackPanel>
<GroupBox FontWeight="Bold" Header="Tables" Padding="2">
<ScrollViewer>
<ItemsControl FontWeight="Normal">
<TextBlock>Foo</TextBlock>
<TextBlock>Bar</TextBlock>
<TextBlock>Baz</TextBlock>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</StackPanel>
</Window>
Теперь GroupBox появляется в верхней части окна, размер которого точно соответствует его содержимому. Если вы достаточно уменьшите окно, GroupBox будет отключен - поскольку он будет соответствовать его содержимому, а не его контейнеру. Это звучит как проблема, которую вы описываете.
Причина в том, что StackPanel спрашивает своих детей, какова их идеальная высота (на основе их содержимого) и использует эту высоту. Без StackPanel (или что-то подобное) значение по умолчанию должно соответствовать элементу управления VerticalAlignment, и если оно установлено на значение Stretch по умолчанию, тогда элемент управления растягивается, чтобы заполнить его родительский элемент. Это означает, что он не будет выше его родителя, который звучит так, как вы хотите.
Решение: удалите StackPanel (или что-то еще, что вызывает проблемы) и используйте что-то еще. В зависимости от того, что вы пытаетесь выполнить, вам может быть повезло с DockPanel или Grid. Трудно сказать, не зная больше о вашем макете.
Изменить: Хорошо, похоже, что проблема действительно является родителем HeaderedContentControl
, но не напрямую. HeaderedContentControl не является панелью, поэтому он не имеет собственного макета (и его потомок, GroupBox, не имеет такой же проблемы). Проблема заключается в шаблоне по умолчанию, который включает StackPanel. Хорошей новостью является то, что вы можете использовать другой шаблон, скажем, с помощью DockPanel:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<HeaderedContentControl>
<HeaderedContentControl.Style>
<Style TargetType="{x:Type HeaderedContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type HeaderedContentControl}">
<DockPanel>
<ContentPresenter ContentSource="Header" DockPanel.Dock="Top"/>
<ContentPresenter/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</HeaderedContentControl.Style>
<GroupBox FontWeight="Bold" Header="Tables" Padding="2">
<ScrollViewer>
<ItemsControl FontWeight="Normal">
<TextBlock>Foo</TextBlock>
<TextBlock>Bar</TextBlock>
<TextBlock>Baz</TextBlock>
</ItemsControl>
</ScrollViewer>
</GroupBox>
</HeaderedContentControl>
</Window>
Если вы оставите часть <HeaderedContentControl.Style>
, это воспроизведет вашу проблему; но со стилем на месте, он позволяет GroupBox заполнять свой контейнер, поэтому ScrollViewer получит полосу прокрутки, когда захотите.