Один из способов, который я могу придумать, - поместить StackPanel в ScrollViewer.Таким образом, убедитесь, что он никогда не выходит за пределы высоты окна.Вы не получите отдельного Свитка для каждого из ваших расширителей (если они находятся в одной и той же StackPanel?), Но я не уверен на 100%, что вы ищете здесь.
<ScrollViewer Name="stackPanelScrollViewer"
Loaded="stackPanelScrollViewer_Loaded"
VerticalScrollBarVisibility="Auto">
<StackPanel CanVerticallyScroll="True" ClipToBounds="False" Height="Auto" Name="StackPanel2" Width="250" DockPanel.Dock="Left" Orientation="Vertical" VerticalAlignment="Top" CanHorizontallyScroll="False" Margin="5">
<Border BorderThickness="0" CornerRadius="5" Padding="1" BorderBrush="Red" Margin="0,5" >
<Expander Header="Expander3" Height="Auto" IsExpanded="False" Width="Auto" Margin="2" BorderThickness="1">
<Grid Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
<TreeView Name="treeView1" Height="Auto" BorderThickness="1" Margin="0,0,0,0" Padding="7" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
</TreeView>
</Grid>
</Expander>
</Border>
</StackPanel>
</ScrollViewer>
Недостатком является то, что TreeView имеет собственный ScrollViewer, определенный в его ControlTemplate, поэтому вы не сможете прокручивать с помощью MouseWheel, если мышь расположена над TreeView.Обходной путь к этому состоит в том, чтобы прикрепить обработчик события MouseWheel для каждого TreeView и сделать оттуда Scroll
private void stackPanelScrollViewer_Loaded(object sender, RoutedEventArgs e)
{
treeView1.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true);
//treeView2.AddHandler(MouseWheelEvent, new RoutedEventHandler(StackPanelMouseWheel), true);
}
private void StackPanelMouseWheel(object sender, RoutedEventArgs e)
{
MouseWheelEventArgs eargs = (MouseWheelEventArgs)e;
double x = (double)eargs.Delta;
double y = stackPanelScrollViewer.VerticalOffset;
stackPanelScrollViewer.ScrollToVerticalOffset(y - x);
}