Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请教一个WPF 中Popup的技术问题,可能是遇到微软的Bug了。 #1

Open
kwonganding opened this issue Sep 16, 2024 · 2 comments

Comments

@kwonganding
Copy link

kwonganding commented Sep 16, 2024

来自:WPF教学|深度解析基于ResourceDictionary的WPF动态主题框架架构|DynamicTheme | 内附源码

非常感谢回复,这个bug困扰了我好几天,也研究了各种方法,有的能绕过,但都不优雅。

需求场景很简单:用一个Popup(粉色的那个区域)来实现快捷输入,点击Popup外的任意地方,Popup自动关闭,如下图。
image

  • 用按钮Click事件打开Popup,一切正常,符合预期。
  • 在输入框的双击事件中打开Popup,就有问题了。
    • 双击输入框,打开Popup,点击Popup外的任意地方,Popup没有关闭。,包括拖动窗口、调整窗口大小,Popup都不会关闭。
    • 如果点击一下Popup中的输入框,再次点击Popup外的任意地方,Popup会正常关闭。

在一篇文章(也是一位微软MVP)中有提到Popup存在的问题:https://blog.walterlv.com/post/how-to-open-a-wpf-popup.html

通过google/chatgpt/stackoverflow 都没找到比较理想的解决方法解决。

代码文件PopupBug.zip

@vickyqu115
Copy link
Collaborator

private async void textPop_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    while (e.ButtonState != MouseButtonState.Released)
    {
        await Task.Delay(1);
    }
    this.OpenPop();
}

因为MouseDoubleClick其实和MouseLeftButtonDown一样是在点击Pressed的瞬间触发事件的,所以在弹出窗口打开的节点和MouseDoubleClick结束的节点(也就是松开鼠标的节点)之间,再加上TextBox焦点的特殊性,就会产生问题。所以这一点可能会被看作是一个bug,但是当这些复杂的现象结合在一起的时候,可能它内部情况也是会变得非常复杂。

所以这里我们可以通过e.ButtonState或Mouse.LeftButton来等待这个按钮的状态变为Released时候,然后在TextBox的MouseDoubleClick Event完全结束的节点(就是Released节点)的时候执行OpenPopup();。

当然也可以不检查Released状态,直接给一个合适的Task.Delay,但如果你要精确控制的话,最好还是检查一下Released状态。

@kwonganding 另外,我们SmartDate那个教学视频中也详细的介绍了Popup相关的内容,有空的时候可以研究一下,对理解Popup也会有很大帮助!

@kwonganding
Copy link
Author

学习了,非常非常感谢。这就去学学SmartDate

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants