Подтвердить что ты не робот

Изменилось ли поведение родителя-ребенка WPF 4.5: теперь мы можем добавить ребенка к другому родителю без исключения?

В .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 не вызывает никаких исключений. Это, по-видимому, приводит к тому, что визуальное дерево имеет какое-то странное состояние, которое отображается как неправильный пользовательский интерфейс.

Почему исключение? Оператор throw по-прежнему присутствует в .Net 4.5 FrameworkElement.AddLogicalChild. Что может быть причиной его отказа?

Я рад принять, что поведение изменилось по уважительной причине, и я должен изменить свое кодирование, однако, поскольку оно стоит, молчащий сбой с поврежденным пользовательским интерфейсом выглядит как шаг назад от сильного исключения, когда явный отключение FrameworkElement от логического дерева было забыто.

4b9b3361

Ответ 1

Есть моменты, когда для ребенка имеет смысл иметь более одного логического родителя, например, в макет-макет-анимация. Я предполагаю, что команда WPF решила, что пришло время позволить разработчикам решить, когда и как использовать это, а не запрещать.