Где находится всплывающее окно ComboBox в визуальном дереве?

Где в визуальном дереве я могу найти всплывающее окно ComboBox (список с элементами ComboBoxItems)?

Я программно открыл ComboBox и, просматривая его в визуализаторе дерева WPF в отладчике, вижу следующее:

: ComboBox
  templateRoot : Grid
    PART_Popup : Popup
    toggleButton : ToggleButton
      templateRoot : Border
        splitBorder : Border
          Arrow : Path
    contentPresenter : ContentPresenter
      : TextBlock

Я ожидал увидеть ScrollViewer с каким-то хостом элементов (StackPanel?), возможно, там, где находится PART_Popup, но ничего.

Так где это?


person Torbjörn Kalin    schedule 06.06.2014    source источник
comment
Popup будет иметь собственное визуальное дерево   -  person dkozl    schedule 06.06.2014
comment
Свое собственное дерево, что означает, что ComboBox и всплывающее окно не имеют общего корня?   -  person Torbjörn Kalin    schedule 06.06.2014
comment
Да, когда вы устанавливаете IsOpen=true, создается новое визуальное дерево. Вы можете прочитать больше на странице MSDN. в разделе Всплывающее окно и визуальное дерево. Текущее визуальное дерево и Popup связаны через Popup.PlacementTarget. Вы можете использовать его, чтобы перейти к главному визуальному дереву   -  person dkozl    schedule 06.06.2014


Ответы (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, поскольку для просмотра визуального дерева необходимо открыть всплывающее окно.

Вы можете использовать Snoop, шпионскую утилиту WPF, которая также имеет функцию проверки визуального дерева. . Снимок из Snoop для всплывающего окна выглядит следующим образом (Windows 8):

введите здесь описание изображения

person Rohit Vats    schedule 06.06.2014
comment
Да, всплывающее окно находится в ControlTemplate, в сетке вместе с ToggleButton и выбранным элементом ContentPresenter. Так почему же я не вижу его в визуальном дереве? - person Torbjörn Kalin; 06.06.2014
comment
Нашел, спасибо. На самом деле я начал с Snoop, но всякий раз, когда мое приложение теряет фокус (когда я переключаюсь на Snoop), всплывающее окно исчезает :( - person Torbjörn Kalin; 07.06.2014