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.5 にもまだ存在しているようFrameworkElement.AddLogicalChildです。投げられない原因は何ですか?

正当な理由で動作が変更されたことを喜んで受け入れ、コーディングを変更する必要がありますが、現状では、UI の破損によるサイレント フェイルは、 FrameworkElement論理ツリーから忘れていました。

4

1 に答える 1

3

レイアウトからレイアウトへのアニメーションなど、子が複数の論理的な親を持つことが理にかなっている場合があります。WPFチームは、これを禁止するのではなく、いつどのように使用するかを開発者に決定させる時期が来たと判断したと思います。

于 2012-09-09T14:24:43.433 に答える