Изменилось ли поведение WPF 4.5 parent-child: теперь мы можем добавить дочерний элемент к другому без исключения родителю?
В.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 решила, что пришло время позволить разработчикам решать, когда и как использовать это вместо того, чтобы запретить это.