首页 > 解决方案 > 设置 ShowDialog 的 UIaccess 更改行为

问题描述

作为 WPF 应用程序的一部分,我有一个登录提示 - 当用户输入错误的密码时,会出现一个新的模式对话框窗口,通知他们他们的密码不正确。

此模式对话框通过 启动ShowDialog(),并按预期运行 - 对话框成功启动,出现在生成它的登录提示之前(我已经在调试器中验证了Owner正确设置为登录提示),并且用户可以在警告消息得到解决之前,不要单击返回登录对话框。

作为外部要求的一部分,我们有一个备用启动器可执行文件,它将清单文件中的 UIaccess 属性设置为true. 我个人不喜欢这种行为,但由于业务需求,无法移除。除了清单文件不同之外,常规启动器和这个备用版本运行完全相同的代码、相同的 dll 等。

问题出在这里:在这个 UIaccess 版本上,当用户输入错误的密码时,登录对话框后面会显示无效凭据的对话框警告。然后用户无法与应用程序的任何部分进行交互,因为代码仍在等待ShowDialog()解析,并且登录对话框窗口被禁用,直到用户关闭警告提示(隐藏在登录对话框后面 - 无法访问)。

虽然我们能够通过向如下所示的模式对话框的构造函数添加检查来解决此问题(登录对话框始终设置为Topmost=true,但此条件确保其他相同类型的对话框不一定是Topmost):

if (owner != null && owner.Topmost)
    Topmost = true;

我们仍然注意到两个版本之间的一些行为不同,但仅在此登录对话框及其模式提示的显示方式上 - 现在模式窗口根据需要显示在顶部,但用户可以单击登录对话框然后它将移动到顶部,尽管它仍然被禁用。

问题的根源是:为什么 UIAccess 属性会ShowDialog()以这种方式改变行为?如果对话框和模态窗口都在同一个线程中,为什么要通过为整个应用程序设置 UIAccess 来改变它们的相对位置?

标签: c#wpf

解决方案


您可以尝试在您的 WPF 应用程序中添加一个新的文本块以避免弹出对话框用于显示错误消息,如果必须需要对话框窗口,您可以尝试使用新线程来管理新窗口以显示此错误,然后,当此窗口弹出,您可以在 WPF 应用程序中禁用登录窗口,当从消息窗口中获取返回值时,将其恢复。


推荐阅读