在Silverlight 5中实现真正的模式对话框

Son*_*ate 3 silverlight silverlight-5.0

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

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

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

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

Son*_*ate 5

为了封闭......

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

public Task<Boolean?> ShowDialog<T>()
    where T : IModalWindow
Run Code Online (Sandbox Code Playgroud)

该方法创建对话框的实例(ChildWindow),将处理程序附加到Closed事件并调用Show方法.在内部,它使用TaskCompletionSource <Boolean?>将任务返回给调用者.在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());
Run Code Online (Sandbox Code Playgroud)

或者,我可以阻止使用Task.Wait()方法 - 虽然这是有问题的,因为正如我在原始帖子中提到的,它阻止了UI线程,所以即使对话框也被冻结.

仍然不是真正的模态对话,但更接近我正在寻找的行为.任何改进或建议仍然受到赞赏.