多年前,我对 Silverlight 的早期版本也有同样的疑问。我检查了控件模板并反编译了 Microsoft 代码,发现它们在整个窗口中使用了不可见的覆盖层来检测点击。 WPF 组合框的工作方式似乎不同,但您可以遵循 Silverlight 模式。
您需要创建一个与窗口大小相同的矩形。我通过使用 RowSpan 来覆盖包含我的整个应用程序的主 Grid 来做到这一点。您还可以将高度/宽度绑定到窗口高度/宽度。有十几种方法可以做到,只要让它填满你的整个窗口。给矩形填充颜色为白色,不透明度为 0。它确实需要填充颜色才能工作,但是不透明度 = 0 时,用户将看不到它。出于调试目的,您可以给它 Red 和 Opacity .25。
<Rectangle x:Name="fullScreenOverlay" Grid.RowSpan="3" Opacity="0" Fill="White" Visibility="Collapsed" MouseDown="FullScreenOverlay_OnMouseDown" />
其中一个关键部分是将 Rectangle 放在 XAML 的底部,以便它呈现在任何其他 XAML 控件之上。
当您打开类似 ComboBox 的控件时,将此矩形设置为可见,以便它可以检测点击/MouseDown。
private void NotificationButton_Click(object sender, RoutedEventArgs e)
{
fullScreenOverlay.Visibility = Visibility.Visible;
notificationPopup.Visibility = Visibility.Visible;
}
当您检测到点击时,将 Rectangle 设置回折叠状态,然后像弹出窗口一样关闭您的 ComboBox。全部完成。
private void FullScreenOverlay_OnMouseDown(object sender, MouseButtonEventArgs e)
{
fullScreenOverlay.Visibility = Visibility.Collapsed;
notificationPopup.Visibility = Visibility.Collapsed;
}
这不会像 Microsoft ComboBox 那样检测应用程序外部发生的点击。它只会检测应用程序内部的点击。但坦率地说,我还是更喜欢这样。