Я столкнулся с точно такой же проблемой, как описано выше - мой ListBox НЕ будет виртуализироваться, потому что он будет занят макетом внутри изменяемого размера элемента управления PopUp. Решение, которое я нашел, состоит в том, чтобы ограничить MaxWidth
и MaxHeight
Сетки, которая содержит ListBox
. Мой PopUp
элемент управления по-прежнему можно изменять с помощью Grip - он просто не безграничен в пространстве, которое он может занять - я думаю, что это простое решение для реализации, как только станет известно, что это может решить проблему: -)
Я знаю, что ListBox
виртуализируется, потому что на запрос, содержащий около 18 000 элементов, отвечают в течение 1-2 секунд вместо 30-60 секунд, а прокрутка выполняется быстрее, а не замораживается.
<Popup x:Name="PART_Popup"
AllowsTransparency="true"
PlacementTarget="{Binding ElementName=PART_ContentHost}"
Placement="Bottom"
IsOpen="{Binding IsPopupOpened, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
PopupAnimation="None"
Focusable="False"
StaysOpen="True"
>
<Border BorderBrush="{TemplateBinding PopupBorderBrush}"
BorderThickness="{TemplateBinding PopupBorderThickness}"
Background="{DynamicResource {x:Static reskeys:ResourceKeys.ControlPopupBackgroundBrushKey}}"
>
<!-- Do NOT REMOVE MaxHeight and MaxWidth
These ensure that containing ListBox is virtualizing -->
<Grid x:Name="PART_ResizeableGrid" Background="Transparent"
MaxHeight="600"
MaxWidth="600"
>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border
x:Name="DropDownBorder"
Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
Width="{Binding ActualWidth, ElementName=PART_ContentHost}"
Height="{Binding ActualHeight, ElementName=PART_ContentHost}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Grid.RowSpan="2"
BorderThickness="0"
/>
<ListBox
x:Name="PART_ItemList" Grid.Row="0"
HorizontalAlignment="Stretch" VerticalAlignment="Top"
ItemsSource="{Binding Suggestions, RelativeSource={RelativeSource TemplatedParent}}"
BorderThickness="0"
ItemTemplate="{TemplateBinding ItemTemplate}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Template="{DynamicResource {x:Static reskeys:ResourceKeys.PopListBoxControlTemplate}}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
DisplayMemberPath="{TemplateBinding DisplayMemberPath}"
SelectedValuePath="{TemplateBinding ValuePath}"
KeyboardNavigation.AcceptsReturn="True"
KeyboardNavigation.DirectionalNavigation="Cycle"
BorderBrush="{TemplateBinding BorderBrush}"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.IsDeferredScrollingEnabled="True"
/>
<!-- RezizeGrip Thumb to support resizing the suggestion lib -->
<Thumb x:Name="PART_ResizeGripThumb"
Grid.Row="0"
Style="{DynamicResource {x:Static reskeys:ResourceKeys.ResizeGripStyleKey}}"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="0"
Background="Transparent"
Width="16"
Height="16" />
</Grid>
</Border>
</Popup>