Где ComboBox всплывающее окно в визуальном дереве?
Где в визуальном дереве я могу найти всплывающее окно ComboBox (список с ComboBoxItems)?
Я программно открыл ComboBox и при просмотре его в WPF Tree Visualizer в отладчике я вижу следующее:
: ComboBox
templateRoot : Grid
PART_Popup : Popup
toggleButton : ToggleButton
templateRoot : Border
splitBorder : Border
Arrow : Path
contentPresenter : ContentPresenter
: TextBlock
Я ожидал увидеть ScrollViewer с каким-то хостом элементов (StackPanel?), Возможно, там, где находится PART_Popup, но ничего.
Так где это?
1 ответ
PART_Popup имеет StackPanel с ItemsHost, установленным в True и обернутым ScrollViewer. Вы можете проверить шаблон по умолчанию здесь в MSDN.
Вот как это выглядит:
<Popup x:Name="Popup"
Placement="Bottom"
IsOpen="{TemplateBinding IsDropDownOpen}"
AllowsTransparency="True"
Focusable="False"
PopupAnimation="Slide">
<Grid x:Name="DropDown"
SnapsToDevicePixels="True"
MinWidth="{TemplateBinding ActualWidth}"
MaxHeight="{TemplateBinding MaxDropDownHeight}">
<Border x:Name="DropDownBorder"
BorderThickness="1">
<Border.BorderBrush>
<SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
</Border.BorderBrush>
<Border.Background>
<SolidColorBrush Color="{DynamicResource ControlLightColor}" />
</Border.Background>
</Border>
<ScrollViewer Margin="4,6,4,6"
SnapsToDevicePixels="True">
<StackPanel IsItemsHost="True"
KeyboardNavigation.DirectionalNavigation="Contained" />
</ScrollViewer>
</Grid>
</Popup>
ОБНОВИТЬ
PopUp и comboBox не имеют общего корня. Они принадлежат разному дереву визуалов, поэтому они не видны в визуализаторе дерева WPF, поскольку для просмотра его дерева визуалов необходимо открыть PopUp.
Вы можете использовать Snoop, шпионскую утилиту WPF, которая также имеет функцию для проверки дерева визуалов. Снимок, взятый из Snoop для всплывающего окна, выглядит следующим образом (Windows 8):