弹出窗口永远不会关闭

8
WPF真的让我很抓狂。我配置了一个包含复杂内容(网格、按钮等)的弹出窗口。我将其StaysOpen属性设置为False,并在文本框MouseDown预览事件上将IsOpen设置为True。
问题是,当单击窗口外部时,它打开但永远不关闭。
有什么建议吗?
谢谢!
更新:
我的弹出窗口里面有按钮。当我点击其中一个时,如果我在它外面点击,弹出窗口就会关闭。是事件路由出现了一些奇怪的问题吗?

你尝试过手动关闭它吗?比如说,它上面有关闭按钮吗?或者将一个键位(比如ESC键)映射为关闭弹出窗口的快捷键。 - Nivid Dholakia
我可以这样做...但是我需要它在失去焦点时自动关闭。 - Luis Aguilar
你能添加一个简单的XAML来演示这个问题吗(这也可能有助于你调试)? - Amittai Shapira
我也遇到了同样的问题。我正在使用PHP SSDK进行FB登录。在成功通过FB进行身份验证后,弹出窗口没有关闭。我的网站在同一个弹出窗口中打开。我需要知道如何在FB登录连接中使用重定向和取消URL,以及如何在登录后刷新父窗口。提前致谢。Umar - Umar Adil
5个回答

5

看起来如果由其他控件事件打开,弹出窗口将不会关闭。我只是将IsOpen属性绑定到ToggleButton的IsChecked属性上,以模拟组合框。

感谢您所有的答案。


我同意,对我也起作用了。行为很奇怪,但是有效。在代码中为IsOpenProperty创建一个绑定到切换按钮的IsChecked属性,它可以正常工作。我接受它 :) - TravisWhidden

1

我使用代码后台来初始化弹出窗口,并发现如果从其他UI操作(如鼠标事件)同步运行,则它不会关闭。为了解决这个问题,我以异步方式运行它:

    public static void ShowPopupMessage(string message)
    {
        DispatcherHelper.UIDispatcher.BeginInvoke(new Action(() =>
        {
            var popup = new Popup
            {
                Child = new AutoHideMessage(message),
                StaysOpen = false,
                IsOpen = true
            };
        }));
    }

这个解决方案对我来说似乎有效,我同意这似乎只会在从某些UI事件(如MouseUp)打开时发生。我认为弹出窗口可能永远不会获得焦点,因此就没有失去焦点事件来关闭它。 - Tekito

1
我也遇到了这个问题,不过是在按钮的PreviewMouseButtonUp事件上。假设有一些与弹出窗口相关的bug,并且尝试在Tunneling事件中打开它们,这导致我找到了解决方法(更加通用)。
我需要通过监听冒泡事件来解决这个问题(主机控件是通用的/可以是多种类型的控件),特别是使用AddHandler(RoutedEvent,Delegate,Boolean)方法来捕获已处理的事件。
猜测问题可能出现在从隧道传输到冒泡时的某个地方。

0
我在文本框的MouseDown预览事件中设置了IsOpen。
设置为什么?文本框托管在哪里?
提供的信息很少,我只能猜测,但我想当你在单击Popup之外时,你的事件处理程序会触发并再次打开它。

文本框位于窗口中使用的用户控件内。在用户控件中,每当单击文本框时,我都会将IsOpen设置为true。当弹出窗口失去焦点时,它永远不会关闭。 - Luis Aguilar

0

您可以使用弹出窗口的LostFocus事件。如果焦点不在弹出窗口内,则将其IsOpen设置为false以关闭它。


它什么也不做。如果我将弹出窗口的IsOpen属性设置为true启动窗口,则它会正常工作。但如果我在文本框PreviewMouseButtonDown事件中设置它,则它不起作用。 - Luis Aguilar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接