WPF组合框-如果展开,将保持在所有窗口的顶部

WPF组合框-如果展开,将保持在所有窗口的顶部,wpf,combobox,z-order,Wpf,Combobox,Z Order,我有一个WPF表格,上面有组合框。如果我展开我的组合框,然后打开一个应用程序,如记事本或任何其他应用程序,该应用程序将覆盖我的WPF表单,但展开的组合框部分仍将位于顶部。因此,当记事本应用程序位于WPF表单和它的ComboBox扩展部分(ComboBox下拉列表)之间时,它就出现了。看起来组合框将始终在z顺序的顶部显示其展开的下拉列表。 这导致了一些其他问题,例如Being无法关闭WPF表单。 这完全是错误的 以上: z-1是我的WPF表单的z顺序,带有扩展的组合框(但请注意,扩展区域位于打

我有一个WPF表格,上面有组合框。如果我展开我的组合框,然后打开一个应用程序,如记事本或任何其他应用程序,该应用程序将覆盖我的WPF表单,但展开的组合框部分仍将位于顶部。因此,当记事本应用程序位于WPF表单和它的ComboBox扩展部分(ComboBox下拉列表)之间时,它就出现了。看起来组合框将始终在z顺序的顶部显示其展开的下拉列表。 这导致了一些其他问题,例如Being无法关闭WPF表单。 这完全是错误的

以上:

  • z-1是我的WPF表单的z顺序,带有扩展的组合框(但请注意,扩展区域位于打开的应用程序顶部,并与WPF表单重叠)

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

  • z-3是我的组合框的扩展下拉列表,位于WPF表单上,顺序为z-1

我的组合框是UserControl的一部分,其xaml如下

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


如何防止屏幕截图中的问题?

我知道在大多数情况下,这种行为是“错误的”;如果当前应用程序失去焦点,您什么时候真的希望下拉列表保持打开状态?但是,正如我在评论中提到的,这是弹出控件的设计行为。引擎盖下的WPF组合框实际上是一个带有弹出控件的切换按钮,该控件设置为在切换按钮时打开。因此…防止您看到的问题是防止弹出控件停留在所有应用程序的顶部

这里有一个问题:)

其中一个实际具有带有派生/自定义弹出控件的代码段,该控件使用user32.dll来防止不希望出现的行为


好吧,很好,这就是如何修复弹出窗口,但如何修复组合框?您只需覆盖默认的ControlTemplate,就可以使用固定的非最顶端的弹出控件而不是标准的WPF弹出控件。

我通过在xaml中将包含我的组合框的WPF表单设置为topmest=“True”来“修复”这一问题。不是完美的修复,但至少消除了愚蠢的外观和它导致我发现的所有其他问题。我不敢相信微软做出了这种默认行为,这简直是愚蠢。

你有什么问题吗?:)WPF combobox的默认控件模板使用扩展combobox itemslist的弹出控件,我认为它在哪个层上显示具有操作系统级别的优先级。@Rowbear请查看更新。我认为在查看屏幕截图和更新的说明后,它会更有意义。非常感谢,但是我决定按照下面的描述去。非常感谢。