gpt4 book ai didi

silverlight - 在 Silverlight 5 中实现真正的模态对话框

转载 作者:行者123 更新时间:2023-12-04 02:29:07 25 4
gpt4 key购买 nike

我正在寻找一种在 Silverlight 5 中实现真正模态对话框的好方法。我发现每个声称创建模态对话框的示例实际上都不是模态的,因为调用代码会一直等到对话框关闭。

我意识到这是一个挑战,因为我们实际上无法阻止 UI 线程,因为它必须运行才能使对话框 (ChildWindow) 正常运行。但是,随着 SL5 中 TPL 的添加以及 Silverlight 在过去几年中的更高采用率,我希望有人找到解决这个问题的方法。

我试图解决的一个很好的代表性场景是显示登录对话框并且必须等待登录完成才能继续的操作(比如单击按钮或菜单项)。

我们的具体业务案例(无论是否合乎逻辑)是应用程序不需要用户身份验证;但是,某些功能需要“管理员”权限。当访问该功能时(通过单击按钮或选择菜单项等),并且当前用户不是管理员,我们将显示登录对话框。当对话框关闭时,我们再次检查用户的授权。如果他们未经授权,我们会显示一条友好的消息并拒绝该操作。如果他们获得授权,我们将继续执行通常涉及将当前 View 更改为新 View 的操作,用户可以在其中执行他们要求的任何操作。

最佳答案

为了关闭...

我最终得到的是一个新的支持 TPL 的 DialogService,其方法如下:

public Task<Boolean?> ShowDialog<T>()
where T : IModalWindow

该方法创建对话框 (ChildWindow) 的实例,将处理程序附加到 Closed 事件并调用 Show 方法。在内部,它使用 TaskCompletionSource 将任务返回给调用者。在 Closed 事件处理程序中,DialogResult 被传递给 TaskCompletionSource 的 TrySetResult() 方法。

这让我可以以典型的异步方式显示对话框:

DialogService.ShowDialog<LoginDialog>().ContinueWith(task =>
{
var result = task.Result;

if ((result == true) && UserHasPermission())
{
// Continue with operation
}
else
{
// Display unauthorized message
}
}, TaskScheduler.FromCurrentSynchronizationContext());

或者,我可以阻止使用 Task.Wait() 方法 - 尽管这是有问题的,因为正如我在原始帖子中提到的那样,它会阻止 UI 线程,因此甚至对话框也会被卡住。

仍然不是真正的模态对话框,但更接近我正在寻找的行为。仍然感谢任何改进或建议。

关于silverlight - 在 Silverlight 5 中实现真正的模态对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com