可视树中的ComboBox弹出窗口在哪里?

时间:2014-06-06 18:55:23

标签: c# wpf combobox visual-tree

在可视树中我可以找到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 个答案:

答案 0 :(得分:5)

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不共享同一个根。 它们属于不同的Visual Tree ,这就是为什么在WPF Tree Visualizer中不可见,因为需要打开PopUp才能看到它的Visual Tree。

您可以使用Snoop这是WPF间谍实用程序,它还具有检查Visual Tree的功能。从Snoop获取弹出窗口的快照看起来像(Windows 8)

enter image description here