Имеет ли ScrollViewer вашего ItemsControl набор прокрутки контента?
Редактировать 2: Как и предполагал Дэн, появляется, как только вы пытаетесь получить плавную прокрутку, вы теряете виртуализацию. Я не уверен, каковы ваши требования, но возможный обходной путь может быть что-то вроде следующего:
<Window x:Class="TestApp11.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:l="clr-namespace:TestApp11"
Title="Window1" Height="200" Width="200">
<Grid>
<ItemsControl>
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer CanContentScroll="True" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type ListBoxItem}">
<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" MaxHeight="160">
<Border Height="200" Width="140" BorderBrush="Red" BorderThickness="10" Margin="1" Background="Blue" />
</ScrollViewer>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
<ContentElement />
</ItemsControl>
</Grid>
</Window>
По сути, вы можете иметь ItemTemplate обернуть ваши элементы UserControl внутри ScrollViewer. Я не показывал это в моем примере, но вы можете привязать MaxHeight ScrollViewer (внутри ItemTemplate) к высоте вашей видимой области, и тогда вертикальная полоса прокрутки будет отображаться, только если ваш UserControl слишком большой поместиться на экране.
Я вижу, где это может быть слишком уродливым решением, чтобы предложить клиенту, однако, в этом случае я думаю, что единственный вариант - пойти по пути, предложенному Дэном.