Silverlight ChildWindow禁用父容器的bug

Silverlight的ChildWindow能让我们方便地实现一个类似Windows中对话框的子窗体,子窗体会以模式对话框的形式显示,禁用父容器,直到关闭子窗体后才恢复父容器。但是在某些情况下(我遇到的情况是频繁地显示和关闭子窗体),关闭ChildWindow之后,父容器依然是Disable状态,而另一些时候,打开ChildWindow后,父容器依然是Enable状态,ChildWindow内部似乎发生了一些小混乱,这个问题似乎从Silverlight 3开始就出现了,直到现在依然存在,我们只能手动去解决这个问题,好在解决方法很简单。

我们可以重写ChildWindow的OnClosed和OnOpened方法,分别将根画布的IsEnabled属性设置为false和true,藉此来确保子窗体关闭或打开后,父容器应该处于正确的状态。代码如下:


protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, true);
}

protected override void OnOpened()
{
base.OnOpened();
Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, false);
}

在我的项目里,许多Silverlight App都需要使用一个ProgressDialog,于是我为UserControl类写了两个扩展方法,用来打开和关闭ProgressDialog,代码如下:


private static ProgressDialog field_progressDialog = new ProgressDialog();

public static void ShowProgressDialog(this UserControl page, string title)
{
page.IsEnabled = false;
page.Cursor = Cursors.Wait;
field_progressDialog.Title = title;
field_progressDialog.Show();
}

public static void CloseProgressDialog(this UserControl page)
{
field_progressDialog.Close();
page.Cursor = Cursors.Arrow;
page.IsEnabled = true;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注