12

在 .Net 4.0 中,以下代码会抛出InvalidOperationException消息“指定元素已经是另一个元素的逻辑子元素。首先断开它。”

var parent = new System.Windows.Controls.ContentControl();
var child = new System.Windows.Controls.Button();

parent.Content = child;

var parent2 = new System.Windows.Controls.ContentControl();
parent2.Content = child;    // throws InvalidOperationException in .Net 4.0, not in 4.5

但是,在安装了 .Net 4.5 的机器上运行此代码不会引发异常。这似乎会导致视觉树有一些奇怪的状态,显示为不正确的 UI。

为什么没有例外?throw声明似乎仍然存在于 .Net 4.5FrameworkElement.AddLogicalChild中。什么会导致它不被抛出?

我很高兴接受行为改变是有充分理由的,我必须改变我的编码,但是,就目前而言,当显式断开 FrameworkElement从逻辑树被遗忘了。

4

1 回答 1

3

有时,孩子有多个逻辑父级是有意义的,例如在布局到布局动画中。我猜 WPF 团队决定是时候让开发人员决定何时以及如何使用它而不是禁止它。

于 2012-09-09T14:24:43.433 回答