WPF ComboBox - 如果展开,则保持在所有 windows 之上
WPF ComboBox - If expanded, stays on top of all windows
我有一个带有 ComboBox 的 WPF 表单。如果我展开我的组合框,然后打开记事本或任何其他应用程序,该应用程序将覆盖我的 WPF 表单,但展开的组合框部分仍位于顶部。因此,它显示为记事本应用程序位于 WPF 窗体及其 ComboBox 的扩展部分(组合框下拉列表)之间。看起来 ComboBox 将始终在 z 顺序的顶部显示其展开的下拉列表。
这导致了一些其他问题,例如蜜蜂无法关闭 WPF 窗体。
这是完全错误的。
以上:
z-1 是我的带有扩展 ComboBox 的 WPF 表单的 z 顺序(但请注意,扩展区域位于打开的应用程序之上并与 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>
如何防止提供的屏幕截图中的问题?
我了解大多数情况下的行为 "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 做出了这种默认行为,这简直是愚蠢。
我有一个带有 ComboBox 的 WPF 表单。如果我展开我的组合框,然后打开记事本或任何其他应用程序,该应用程序将覆盖我的 WPF 表单,但展开的组合框部分仍位于顶部。因此,它显示为记事本应用程序位于 WPF 窗体及其 ComboBox 的扩展部分(组合框下拉列表)之间。看起来 ComboBox 将始终在 z 顺序的顶部显示其展开的下拉列表。 这导致了一些其他问题,例如蜜蜂无法关闭 WPF 窗体。 这是完全错误的。
以上:
z-1 是我的带有扩展 ComboBox 的 WPF 表单的 z 顺序(但请注意,扩展区域位于打开的应用程序之上并与 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>
如何防止提供的屏幕截图中的问题?
我了解大多数情况下的行为 "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 做出了这种默认行为,这简直是愚蠢。