当其他窗口处于焦点时隐藏弹出控件

时间:2009-04-23 15:57:50

标签: wpf popup custom-controls

我有一个自定义UserControl,它尝试为文本框重新创建自动完成。当用户输入时,文本用于过滤提供的项目集合,然后弹出窗口显示一个ListBox,其中的项目与用户键入的内容相匹配。

不幸的是,如果用户决定从应用程序切换到另一个窗口(浏览器,MSWord,任何东西!),弹出窗口仍然位于每个其他窗口之上!

另外,如果我在弹出窗口的情况下移动我的窗口(托管自定义控件),弹出窗口就会保持原位(并且不会跟随窗口)!这有点好笑,但显然是不可接受的行为。我环顾四周,但只发现了一篇关于这个问题的帖子两年没有得到答复:(

3 个答案:

答案 0 :(得分:15)

实际上,我没有意识到我将Popup的StaysOpen属性设置为true

<Popup StaysOpen="False" />

实际上对我有用。

答案 1 :(得分:4)

我在类似的情况下遇到了同样的问题。我所做的是我订阅了控件的所有可能的“失去焦点”事件,并且还获得了托管控件并订阅其GotMouseCapture和LocationChanged事件的窗口。所有这些事件的事件处理程序都将弹出窗口的IsOpen属性设置为false。

您可以使用以下方式获取托管窗口:

parentWindow = Window.GetWindow(this);

所有其他代码只是很多订阅事件来做同样的事情。

P.S。我不是说这是一个非常好的或最佳的解决方案,但对我来说效果很好:)。

答案 2 :(得分:0)

根据Popup documentation

  

当弹出窗口显示在屏幕上时,如果其父级重新定位,则不会重新定位。

所以看起来它不是自动完成文本框的一个非常好的候选者。我认为当您将鼠标悬停在某个项目上时,该课程更多地用于显示信息。