如何更改 ComboBox 列表以在 WPF 中以编程方式显示在对象上方?

How to change ComboBox list to appear above object programatically in WPF?

如何仅使用 C# 将组合框列表更改为始终显示在组合框对象上方(无 XML)? 属性 DropDownStyle 在这种情况下似乎不可用。

首先,请注意 DropDownStyle 仅适用于 Windows Forms ComboBox, not a WPF ComboBox

因此,您需要使用 WPF 以不同的方式处理此问题。基本上,WPF 使用样式和模板来确定控件的视觉方面。

对于这个特殊问题,您需要编辑 ComboBox 的 Popup 控件的 Placement 属性,它是其 ControlTemplate 的一部分。

这是一个如何执行此操作的示例(将其放在代码隐藏中):

protected override void OnInitialized(EventArgs e)
{
    base.OnInitialized(e);

    // create a combo box
    var comboBox = new ComboBox
    {
        HorizontalAlignment = HorizontalAlignment.Center,
        VerticalAlignment = VerticalAlignment.Center,
        Width = 200
    };

    // add some items
    comboBox.Items.Add(new ComboBoxItem { Content = "Apple" });
    comboBox.Items.Add(new ComboBoxItem { Content = "Banana" });
    comboBox.Items.Add(new ComboBoxItem { Content = "Orange" });

    // add the combo box to your window
    AddChild(comboBox);

    // apply the control template
    comboBox.ApplyTemplate();

    // obtain the popup (which is named "PART_Popup") from the control template
    var controlTemplate = comboBox.Template;
    var popup = (Popup)controlTemplate.FindName("PART_Popup", comboBox);

    // set the placement of the popup
    if (popup != null) popup.Placement = PlacementMode.Top;
}

最后一点:我怎么知道有一个叫"PART_Popup"的Popup?有几种方法:

  1. 您可以使用 Visual Studio 设计器为任何内置控件实际生成标准控件模板的副本。具体来说,在 window 中放置一个控件(例如 ComboBox),转到文档大纲,右键单击 ComboBox,然后 select "Edit Template...".
  2. 您可以使用 Snoop utility 在您的 window 中实际看到 controls/graphics 的 "visual tree"。