异步显示自定义MessageBox,然后是最顶级MessageBox中的所有按钮

时间:2014-03-04 11:44:53

标签: c# wpf button asynchronous messagebox

我在MessageBox中自定义MessageBox.cs。在MainWindow中,如果单击名为Open Two MessageBox的按钮,则将开始分别运行两个BackgroundWorker睡眠2000毫秒和1000毫秒,并显示MessageBoxes。但你可以找到:

enter image description here

MessageBox1中的按钮进入MessageBox2。我不知道为什么?

这些按钮是在MessageBoxModule中的CtrlButtonCollection中创建和保存的。

我会因这个问题而发疯。

由于项目中有很多代码,所以我把它放在GitHub中。

The project in GitHub

2 个答案:

答案 0 :(得分:2)

你的MessageBoxModule.CtrlButtonCollectionProperty是静态的,所以,它只会注册一次,你将为你创建的所有消息框都有相同的List()。

使用非静态DependencyProperty来解决此问题。 (我也考虑重写整篇文章)。

答案 1 :(得分:1)

您应始终避免在依赖项属性的默认元数据中初始化引用类型。由于DP标识符注册是静态的,因此该引用将在MessageBox 的所有实例之间共享。

public static DependencyProperty CtrlButtonCollectionProperty =
            DependencyProperty.Register(
                "CtrlButtonCollection",
                typeof(IList<Button>),
                typeof(MessageBoxModule),
                new PropertyMetadata(new List<Button>())); <-- HERE

使用其他重载,您不需要传递默认元数据或传递null,这是所有引用类型的默认值,即声明如下:

public static DependencyProperty CtrlButtonCollectionProperty =
            DependencyProperty.Register(
                "CtrlButtonCollection",
                typeof(IList<Button>),
                typeof(MessageBoxModule));

在构造函数中进行初始化:

public MessageBoxModule
{
    .....
    CtrlButtonCollectionProperty = new List<Button>();
    .....
}