设置UIaccess改变ShowDialog

时间:2018-05-17 19:21:26

标签: c# wpf

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

此模式对话框通过ShowDialog()启动,并按预期运行 - 对话框成功启动,出现在产生它的登录提示前面(我已在调试器中验证Owner正在正确设置登录提示),用户无法单击返回登录对话框,直到收到警告消息。

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

问题在于:在此UIaccess版本上,当用户输入错误的密码时,无效凭据的对话框警告会在登录登录对话框后显示。然后,用户无法与应用程序的任何部分进行交互,因为代码仍在等待ShowDialog()解析,并且登录对话框窗口因此而被禁用。

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

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

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

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

1 个答案:

答案 0 :(得分:-1)

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