Сбой WPF не в нашем коде

#wpf #crash

#wpf #сбой

Вопрос:

Кто-нибудь знает, как устранить сбой в WPF, где стек вызовов полностью находится в коде Windows.

Ниже приведен стек вызовов…

26.06.2014 3:29:05 вечера: [ФАТАЛЬНАЯ] система.Исключение InvalidOperationException: указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его. в системе.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent) в системе.Windows.FrameworkElement.Добавьте logicalchild(дочерний объект) в систему.Windows.Элементы управления.ContentControl.OnContentChanged(объект oldContent, объект newContent) в системе.Windows.Элементы управления.TabItem.OnContentChanged(объект oldContent, объект newContent) в системе.Windows.Элементы управления.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs аргументы) в системе.окна FrugalStructList.DependencyObject.updateffectivevalue(EntryIndex entryIndex, DependencyProperty dp, метаданные PropertyMetadata, EffectiveValueEntry oldEntry, EffectiveValueEntryamp; newEntry, логическое принуждение с deferredreference, логическое принуждение с currentValue, operationType operationType) в системе.Windows.StyleHelper.ApplyStyleOrTemplateValue(FrameworkObject fo, DependencyProperty dp) в системе.Windows.StyleHelper.InvalidateContainerDependents(контейнер DependencyObject, 1amp; exclusionContainerDependents, FrugalStructList 1 и oldContainerDependents, FrugalStructList`1и newContainerDependents) в системе.Windows.StyleHelper.DoStyleInvalidations(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style NewStyle) в системе.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe, FrameworkContentElement fce, Style oldStyle, Style NewStyle, Styleamp; styleCache) в системе.Windows.FrameworkElement.OnStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs аргументы) в системе.Windows.DependencyObject.updateffectivevalue(EntryIndex entryIndex, DependencyProperty dp, метаданные PropertyMetadata, EffectiveValueEntry oldEntry, EffectiveValueEntryamp; newEntry, логическое принуждение с deferredreference, логическое принуждение с currentValue, operationType operationType) в системе.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, значение объекта, метаданные PropertyMetadata, логическое принудительное с deferredreference, логическое принудительное с currentValue, operationType operationType, логическое внутреннее) в системе.Windows.Элементы управления.ItemsControl .ApplyItemContainerStyle(контейнер DependencyObject, элемент объекта) в системе.Windows.Элементы управления.ItemsControl.MS.Internal.Элементы управления.IGeneratorHost.PrepareItemContainer(контейнер DependencyObject, элемент объекта) в системе.Windows.Элементы управления.ItemContainerGenerator .Система.Windows.Элементы управления.Примитивы.IItemContainerGenerator .PrepareItemContainer(контейнер DependencyObject) в системе.Windows.Элементы управления.Панель.Создайте children() в системе.Windows.Элементы управления.Панель.OnItemsChangedInternal(отправитель объекта, аргументы ItemsChangedEventArgs) в системе.Windows.Элементы управления.Панель.OnItemsChanged(отправитель объекта, аргументы ItemsChangedEventArgs) в системе.Windows.Элементы управления.ItemContainerGenerator .onRefresh() в системе.Windows.Элементы управления.ItemContainerGenerator .OnCollectionChanged(отправитель объекта, аргументы NotifyCollectionChangedEventArgs) в системе.Windows.Элементы управления.ItemContainerGenerator .Система.Windows.IWeakEventListener.ReceiveWeakEvent(тип managerType, отправитель объекта, EventArgs e) в системе.Windows.WeakEventManager.DeliverEventToList(отправитель объекта, аргументы EventArgs, список ListenerList) в системе.Windows.WeakEventManager.DeliverEvent(отправитель объекта, аргументы EventArgs) в системе.Коллекции.Специализированный.CollectionChangedEventManager.OnCollectionChanged(отправитель объекта, аргументы NotifyCollectionChangedEventArgs) в системе.Коллекции.Специализированный.NotifyCollectionChangedEventHandler.Вызов (отправитель объекта, NotifyCollectionChangedEventArgs e) в системе.Windows.Data.Просмотр коллекции.OnCollectionChanged(NotifyCollectionChangedEventArgs args) в системе.Windows.Элементы управления.ItemCollection.Установите CollectionView (представление CollectionView) в системе.Windows.Элементы управления.ItemCollection.SetItemsSource(IEnumerable value) в системе.Windows.Элементы управления.ItemsControl .OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e) в системе.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs аргументы) в системе.Windows.DependencyObject.updateffectivevalue(EntryIndex entryIndex, DependencyProperty dp, метаданные PropertyMetadata, EffectiveValueEntry oldEntry, EffectiveValueEntryamp; newEntry, логическое принуждение с deferredreference, логическое принуждение с currentValue, operationType operationType) в системе.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp) в системе.Windows.Data.BindingExpressionBase.Аннулировать (логическое значение isASubPropertyChange) в системе.Windows.Data.BindingExpression.TransferValue(Object newValue, логическое значение isASubPropertyChange) в системе.Windows.Data.BindingExpression.Активировать (элемент объекта) в системе.Windows.Data.BindingExpression.AttachToContext (попытка AttachAttempt) в системе.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(логический последний шанс) в MS.Internal.Data.DataBindEngine.Task.Run(логический последний шанс) в MS.Internal.Data.DataBindEngine.Выполнить (аргумент объекта) в MS.Internal.Data.DataBindEngine.OnLayoutUpdated(отправитель объекта, EventArgs e) в системе.Windows.ContextLayoutManager.fireLayoutUpdateEvent() в системе.Windows.ContextLayoutManager.UpdateLayout() в системе.Windows.ContextLayoutManager.UpdateLayoutCallback(аргумент объекта) в системе.Windows.Медиафайлы.Медиаконтекст.InvokeOnRenderCallback .DoWork() в системе.Windows.Медиафайлы.MediaContext.FireInvokeOnRenderCallbacks() в системе.Windows.Медиафайлы.MediaContext.RenderMessageHandlerCore(изменение размера объекта CompositionTarget) в системе.Windows.Медиафайлы.MediaContext.RenderMessageHandler(изменение размера объекта CompositionTarget) в системе.Windows.Многопоточность.ExceptionWrapper.InternalRealCall(обратный вызов делегата, аргументы объекта, Int32 numArgs) в MS.Internal.Многопоточность.ExceptionFilterHelper.TryCatchWhen(источник объекта, метод делегирования, аргументы объекта, Int32 numArgs, делегат catchHandler)

Комментарии:

1. Это проблема в вашем коде. Вы либо возитесь с визуальным деревом в процедурном коде, что действительно плохо, либо есть проблема, связанная с XAML, когда вы неправильно помещаете элементы пользовательского интерфейса друг в друга. Попробуйте изолировать XAML, который загружается в момент исключения, или попробуйте использовать PresentationTraceSources для отладки материалов, связанных с XAML.

2. Я не думал, что это не проблема в моем коде, просто пытаюсь выяснить, что ее вызывает…

3. Возиться с визуальным деревом не обязательно плохо, это просто сложнее и рискованнее. Если вы хотите создавать сложные элементы управления и использовать самые мощные аспекты WPF (включая виртуализацию пользовательского интерфейса), вам «нужно» коснуться визуального дерева.

4. @HighCore, если вы хотите быть полезным, а не унижать, возможно, разъясните, как использовать PresentationTraceSources для отладки. Я с этим не знаком.

Ответ №1:

Вы получаете эту ошибку, потому что пытаетесь установить элемент управления (визуальный) в качестве дочернего элемента другого визуального элемента, предварительно не удалив его из визуального дерева. Визуал никогда не может быть в визуальном дереве в двух местах.

Сложной частью будет отслеживание того, какой визуальный элемент вставляется в дерево дважды. Вам будет очень сложно поймать это в отладчике (думаю, почти невозможно), поэтому вам придется попробовать более креативные методы отладки. Если вы можете последовательно воспроизвести проблему, возможно, попробуйте удалять визуальные элементы по одному и посмотреть, какой визуальный элемент вызывает проблему таким образом. Если у вас есть некоторые пользовательские элементы управления, которые работают с некоторыми функциями визуального дерева более низкого уровня, это вызовет большие подозрения. Сначала взгляните на них.

Комментарии:

1. Наиболее распространенный способ настройки визуального дерева объекта — переопределить VisualChildrenCount , GetVisualChild и использовать это. AddVisualChild() . Любые классы, которые выполняют какие-либо из этих действий, вызывают большие подозрения в причастности к этой проблеме.

2. Проблема, по-видимому, вызвана использованием приложения при подключении к удаленному рабочему столу. Когда приложение запускается из подключения к удаленному рабочему столу, когда соединение закрывается, а затем снова открывается, приложение выходит из строя. Похоже, что когда соединение закрывается, а затем снова открывается, элементы пользовательского интерфейса снова инициализируются (InitializeComponent ). Затем некоторые элементы дублируются в визуальном дереве.

3. Возможно ли, что некоторые пользовательские элементы управления не удаляют / не очищают визуальное дерево? Это общая ошибка WPF, связанная с удаленным рабочим столом, или это что-то конкретное, что вы делаете (например, используя пользовательский элемент управления), который необходимо изменить?

4. Ошибка не возникает на главном экране. После подключения к устройству ошибка действительно возникает. Я убрал все экраны из плагина, так что, вероятно, проблема в ViewSwitchControl. В ViewSwitchControl нет никакой визуальной очистки дерева.

5. После дальнейшей отладки проблема, похоже, не в ViewSwitchControl.