WPF ComboBox - 如果展开,则保持在所有窗口之上

时间:2016-05-03 23:00:59

标签: wpf combobox z-order

我有一个带有ComboBox的WPF表单。如果我展开我的组合框,然后打开一个应用程序,如记事本或任何其他,该应用程序将覆盖我的WPF表单,但扩展的ComboBox部分仍将在顶部。因此,Notepad应用程序显示在WPF表单和ComboBox的扩展部分(组合框下拉列表)之间。看起来ComboBox将始终在z-order的顶部显示其扩展下拉列表。 这导致很少其他问题,例如无法关闭WPF表单。 这是完全错误的。

enter image description here

以上:

  • z-1是我的WPF表单的z顺序,带有扩展的ComboBox(但请注意,展开的区域位于打开并重叠WPF表单的应用程序之上

  • z-2是打开记事本应用程序的顺序,并将我的WPF表单与其上的ComboBox重叠(再次,您可以看到记事本与WPF表单重叠,但ComboBox扩展下拉列表与记事本重叠。它应该在记事本后面,不在它面前)

  • z-3是我的ComboBox的扩展下拉列表,位于WPF表单上,带有z-1命令

我的ComboBox是UserControl的一部分,它的xaml就像这样

    <ComboBox Name="MyComboBox" 
              ItemsSource="{Binding ItemsSet}" 
              DisplayMemberPath="Name"
              SelectedValuePath="Name"
              SelectedItem="{Binding Path=SelectedItem}"
              BorderBrush="Green" 
              BorderThickness="2">
    </ComboBox>

如何在提供的屏幕截图中阻止此问题?

2 个答案:

答案 0 :(得分:1)

我理解这种行为在大多数情况下是“错误的”;如果当前应用程序失去焦点,你真的希望下拉列表保持打开状态?但是,正如我在评论中提到的那样,这是Popup控件的设计行为。引擎盖下的WPF组合框实际上是一个ToggleButton,其弹出控件设置为在切换ToggleButton时打开。所以...防止你看到的问题的方法是阻止Popup控件保持在所有应用程序之上。

有一个StackOverflow问题:) Popup always stays on top

其中一个answers实际上包含一个带有派生/自定义弹出控件的代码段,该控件使用user32.dll来防止意外行为。

太棒了,这就是你修复Popup的方法,但是你如何修复一个ComboBox?您只需覆盖默认的ControlTemplate即可使用固定非最顶级的Popup控件而不是标准的WPF Popup。

答案 1 :(得分:0)

我&#34;修复&#34;通过将包含我的ComboBox的WPF表单设置为TopMost =&#34; True&#34;在它的xaml。不是完美的修复,但至少消除了愚蠢的外观和它导致我发现的所有其他问题。我无法相信MS做出了这种默认行为,这很简单。