如何使ChildWindow阻止

Mik*_*all 14 silverlight silverlight-3.0

ChildWindow是一个模态窗口,但它不会阻塞.有没有办法让它阻止?我基本上想要一个ShowDialog()方法,它将调用ChildWindow.Show(),但在用户关闭ChildWindow之前不会返回.我尝试使用Monitor.Enter()来阻止ChildWindow.Show(),但是ChildWindow从未呈现过,浏览器只是挂起.有人有主意吗?

Jon*_*way 7

我不相信它支持这种行为.您可以在CodePlex上投票.根据您的需要,您可能会在此处查看Tim Heuer的一些变通方法,或者使用其他自定义控件,例如Silverlight模态控件(在CodePlex上).


Kei*_*ney 5

您无法在Silverlight中执行您想要执行的操作.您对UI所做的任何更改都将在UI线程上运行.如果您阻止UI线程,则用户无法与浏览器进行交互,因此他们无法采取任何操作来取消阻止该线程.

如果您真的想要创建阻止对话框窗口,那么唯一的方法是从非UI线程.例如,您可以创建一个类似于以下内容的方法:

    private void ShowModalDialog()
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        Dispatcher.BeginInvoke(() =>
        {
            ChildWindow cw = new ChildWindow();
            cw.Content = "Modal Dialog";
            cw.Closed += (s, e) => waitHandle.Set();
            cw.Show();
        });
        waitHandle.WaitOne();
    }
Run Code Online (Sandbox Code Playgroud)

此方法将显示一个对话框窗口,并且在关闭对话框窗口之前不会返回.但是这个方法只能从非UI线程调用.从UI线程调用它将导致死锁(因为UI线程正在等待只能在UI线程上触发的事件).

或者,您应该考虑使逻辑异步,而不是强制它是同步的.