Изменилось ли поведение родителя-ребенка 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
от логического дерева было забыто.
Ответы
Ответ 1
Есть моменты, когда для ребенка имеет смысл иметь более одного логического родителя, например, в макет-макет-анимация. Я предполагаю, что команда WPF решила, что пришло время позволить разработчикам решить, когда и как использовать это, а не запрещать.