C# 设置UIaccess更改ShowDialog的行为

C# 设置UIaccess更改ShowDialog的行为,c#,wpf,C#,Wpf,作为WPF应用程序的一部分,我有一个登录提示-当用户输入错误的密码时,会出现一个新的模式对话框窗口,通知他们密码不正确 此模式对话框通过ShowDialog()启动,并按预期运行-对话框成功启动,出现在生成它的登录提示符前(我已在调试器中验证Owner是否正确设置为登录提示符),在警告消息被处理之前,用户不能单击返回登录对话框 作为外部需求的一部分,我们有一个备用启动程序可执行文件,它将清单文件中的UIaccess属性设置为true。我个人不喜欢这种行为,但由于业务需要,无法删除它。除了清单文件

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

此模式对话框通过
ShowDialog()
启动,并按预期运行-对话框成功启动,出现在生成它的登录提示符前(我已在调试器中验证
Owner
是否正确设置为登录提示符),在警告消息被处理之前,用户不能单击返回登录对话框

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

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

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

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


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

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

出于安全原因,您通常不会对登录错误给出任何提示…如错误的用户或错误的密码…您最好在登录对话框中显示一条genric错误消息,这样您就可以避免弹出消息。您是否尝试过此操作@DeshDeepSingh这就是我们目前正在做的,在没有UIAccess参数设置的版本上,一切都正常工作。
if (owner != null && owner.Topmost)
    Topmost = true;