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

WPF ComboBox - If expanded, stays on top of all windows

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

以上:

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

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

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

我了解大多数情况下的行为 "wrong";如果焦点丢失在当前应用程序上,您什么时候真正希望下拉菜单保持打开状态?但是,正如我在评论中提到的,这是 Popup 控件的设计行为。引擎盖下的 WPF 组合框实际上是一个带有 Popup 控件的 ToggleButton,该控件设置为在切换 ToggleButton 时打开。所以...防止您看到的问题的方法是防止 Popup 控件停留在所有应用程序之上。

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

answers 中的一个实际上有一个带有 derived/custom 弹出控件的代码片段,该控件使用 user32.dll 来防止意外行为。

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

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