我有一个登录提示作为WPF应用程序的一部分 - 当用户输入错误的密码时,会出现一个新的模式对话窗口,通知他们他们的密码不正确.
此模式对话框通过ShowDialog(),并按预期运行 - 对话框成功启动,出现在生成它的登录提示前面(我已在调试器中验证Owner正确设置为登录提示),用户可以' t单击返回登录对话框,直到找到警告消息.
作为外部需求的一部分,我们有一个备用启动程序可执行文件,它将清单文件中的UIaccess属性设置为true.我个人不喜欢这种行为,但由于业务需求,它无法删除.除了清单文件差异之外,常规启动器和此备用版本运行完全相同的代码,相同的dll等.
问题在于:在此UIaccess版本上,当用户输入错误的密码时,登录对话框后面会显示无效凭据的对话框警告.然后,用户无法与应用程序的任何部分进行交互,因为代码仍在等待ShowDialog()解析,并且由于此而禁用了登录对话框窗口.
虽然我们能够通过向模式对话框的构造函数添加一个检查来解决此问题,该对话框看起来像这样(登录对话框始终设置为Topmost=true,此条件确保不必使用相同类型的其他对话框Topmost):
if (owner != null && owner.Topmost)
Topmost = true;
Run Code Online (Sandbox Code Playgroud)
我们仍然注意到两个版本之间存在一些不同的行为,但仅限于此登录对话框及其模式提示的显示方式 - 现在模态窗口根据需要显示在顶部,但用户可以单击登录对话框虽然它仍然被禁用,但它会向上移动到顶部.
问题的根源是:为什么UIAccess属性会ShowDialog()以这种方式改变行为?如果对话框和模态窗口都在同一个线程中,为什么要通过为整个应用程序设置UIAccess来改变它们的相对位置?
小智 -4
您可以尝试在 WPF 应用程序中添加一个新的文本块,以避免弹出对话框用于显示错误消息,如果必须需要对话框窗口,您可以尝试使用新线程来管理新窗口来显示此错误,然后,当此窗口弹出窗口,您可以在 WPF 应用程序中禁用登录窗口,并在从消息窗口获取返回值时恢复它。