我有一个自定义 UserControl,它试图为文本框重新创建自动完成功能。当用户键入时,文本用于过滤提供的项目集合,然后弹出窗口显示一个列表框,其中包含与用户键入的内容相匹配的项目。
不幸的是,如果用户决定从应用程序切换到另一个窗口(浏览器、MSWord 等等!),弹出窗口仍然位于所有其他窗口的顶部!
此外,如果我在弹出窗口打开的情况下移动窗口(托管自定义控件),弹出窗口将保持原位(并且不跟随窗口)!这有点有趣,但显然是不可接受的行为。我环顾四周,但只发现一篇关于此的帖子两年没有得到答复:(
我有一个自定义 UserControl,它试图为文本框重新创建自动完成功能。当用户键入时,文本用于过滤提供的项目集合,然后弹出窗口显示一个列表框,其中包含与用户键入的内容相匹配的项目。
不幸的是,如果用户决定从应用程序切换到另一个窗口(浏览器、MSWord 等等!),弹出窗口仍然位于所有其他窗口的顶部!
此外,如果我在弹出窗口打开的情况下移动窗口(托管自定义控件),弹出窗口将保持原位(并且不跟随窗口)!这有点有趣,但显然是不可接受的行为。我环顾四周,但只发现一篇关于此的帖子两年没有得到答复:(
实际上,我没有意识到我StaysOpen将 Popup 的属性设置为true.
<Popup StaysOpen="False" />
实际上对我有用。
在类似的情况下,我遇到了同样的问题。我所做的是订阅了控件的所有可能的“失去焦点”事件,并且还获得了托管控件的窗口并订阅了它的 GotMouseCapture 和 LocationChanged 事件。所有这些事件的事件处理程序都将弹出窗口的 IsOpen 属性设置为 false。
您可以通过以下方式获取托管窗口:
parentWindow = Window.GetWindow(this);
所有其他代码只是大量订阅事件来做同样的事情。
PS我并不是说这是一个漂亮或最佳的解决方案,但它对我来说很好:)