【问题标题】:Hiding Popup control when other window's in focus当其他窗口处于焦点时隐藏弹出控件
【发布时间】:2009-04-23 15:57:50
【问题描述】:

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

不幸的是,如果用户决定从应用程序切换到另一个窗口(浏览器、MSWord 等等!),弹出窗口将保持在所有其他窗口的顶部!

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

【问题讨论】:

  • 截至 2010 年 2 月,WPF 自动完成框有这个问题... :(

标签: wpf popup custom-controls


【解决方案1】:

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

<Popup StaysOpen="False" />

实际上对我有用。

【讨论】:

    【解决方案2】:

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

    您可以通过以下方式获取托管窗口:

    parentWindow = Window.GetWindow(this);
    

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

    附:我并不是说这是一个漂亮或最佳的解决方案,但它对我来说很好:)

    【讨论】:

      【解决方案3】:

      根据Popup documentation

      当 Popup 显示在屏幕上时,如果它的父级被重新定位,它不会重新定位自己。

      所以它看起来不太适合自动完成文本框。我认为该类更多地用于在您将鼠标悬停在项目上时显示信息。

      【讨论】:

      • ComboBox 使用 Popup,并且在 ComboBox 移动时保持在原位......所以它必须是可能的
      猜你喜欢
      • 2011-03-07
      • 2013-01-09
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多