我在MessageBox
中自定义MessageBox.cs
。在MainWindow中,如果单击名为Open Two MessageBox
的按钮,则将开始分别运行两个BackgroundWorker
睡眠2000毫秒和1000毫秒,并显示MessageBoxes。但你可以找到:
MessageBox1中的按钮进入MessageBox2。我不知道为什么?
这些按钮是在MessageBoxModule中的CtrlButtonCollection中创建和保存的。
我会因这个问题而发疯。
由于项目中有很多代码,所以我把它放在GitHub中。
答案 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>();
.....
}