事件处理程序不工作 - 弹出窗口上的 Lost Focus 事件

Event handler not working - Lost Focus event on Popup

我试图在失去焦点时关闭弹出窗口(即用户点击弹出窗口外的某处)

在我的主页中我有这个

    Popup p;
    public MainPage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = NavigationCacheMode.Required;
        p = new Popup();
        p.LostFocus += new RoutedEventHandler(p_LostFocus);
    }

而我的失焦事件是这样的

    void p_LostFocus(object sender, RoutedEventArgs e)
    {
        p.IsOpen = false;
    }

当我在弹出窗口外点击时没有任何反应,它甚至不执行 p_lostFocus 方法。有什么建议吗?

Popup 控件呈现在所有其他控件之上。似乎在 Popup 打开时,其他控件无法获得焦点,因此 不能 失去 其焦点。 (原因可能是 Popup 控件被分配了一个唯一的 window 句柄,而不是像所有其他控件一样作为页面的一部分呈现 - 至少在 WPF 中是这样。请更正如果我错了...)。

总之,如果你只是想在点击其他地方时关闭Popup,你只需要确保弹出的IsLightDismissEnabled 属性设置为true ,或者在 XAML 代码中:

<Popup IsLightDismissEnabled="True" ...>

或在 C# 代码中:

p.IsLightDismissEnabled = true;

选择第二个选项时,您可以在实例化Popup后的任何时间将其设置,然后将其设置在页面的构造函数中,在调用InitializeComponent()之后,例如:

p = new Popup();
p.IsLightDismissEnabled = true;

在这种情况下,您根本不需要 LostFocus 事件。

如果您想在关闭弹出窗口后执行其他操作,请注册其 Closed 事件而不是 LostFocus 事件。