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

Я реализую упомянутое здесь решение Drag Drop:

http://bea.stollnitz.com/blog/?p=53

У меня мало ListBoxes+ с WrapPanel и Items. я должен иметь возможность перетаскивать элемент из любого ящика в любой другой.

Когда я перетаскиваю элемент и перемещаю его в другое поле, он выдает мне ошибку:

Не удается получить доступ к декоративным элементам для элемента, у которого нет декоративных элементов.

в этой строке:

if (this.adornerLayer != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}

Я попытался увидеть значение AdornedElement, я увидел, что оно имеет это значение:

ListBoxItem : DisconnectedItem. Я видел содержимое ListBoxItem и, кажется, он также имеет отключенный элемент.

Проблема также возникает, если я перемещаю свои элементы в том же списке. В моем списке используется wrapPanel как ItemsPanelTemplate.

дерево иерархии похоже на это из listBoxes:

1 Окно списка: UserControl Border Grid Grid Border Border Border Border ScrollViewer ListBox ItemsPanel

Другие 3 ListBoxes: UserControl Граница Сетка Сетка Сетка вкладка Control tabItem Grid Border Border Border Border ScrollViewer ListBox ItemsPanel

AnyOne, кто столкнулся с этой проблемой или может помочь мне, что происходит не так?

  • Гирия

person Shankar    schedule 02.11.2011    source источник


Ответы (4)


Я также смог воспроизвести эту проблему. Я смог предотвратить остановку ошибки, изменив строку кода на это:

if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}
person jhamm    schedule 20.07.2012

это ошибка .Net 4.0

http://social.msdn.microsoft.com/Forums/en/wpf/thread/e6643abc-4457-44aa-a3ee-dd389c88bd86?prof=required

вы также можете увидеть это в элементах управления вкладками.

Каждый раз, когда что-то не отображается на самом деле, как только вы выпадаете из визуального дерева, ваши привязки могут испортиться.

person Bas Hamer    schedule 07.12.2011

Пробовал подход, предложенный jhamm, к сожалению, в моем случае он не работает. В итоге я изменил код, который был предложен в теме на форуме Microsoft, упомянутой выше:

        ContentControl contentCtl = this.AdornedElement as ContentControl;
        if (contentCtl == null ||
            contentCtl.Content == null)
        {
            return;
        }

        var contentType = contentCtl.Content.GetType();
        if (contentType.FullName.Equals("MS.Internal.NamedObject"))
        {
            return;
        }

        if (this.adornerLayer != null &&
            this.contentPresenter.Content != null)
        {
            try
            {
                this.adornerLayer.Update(this.AdornedElement);
            }

Чек

        var contentType = contentCtl.Content.GetType();
        if (contentType.FullName.Equals("MS.Internal.NamedObject"))
        {
            return;
        }

терпит неудачу, когда элемент отключен.

Кстати, ошибка, как сообщалось, была исправлена ​​​​в 4.5.

person Alex Korobko    schedule 10.07.2013

Мне помогло проверить, можно ли найти adornerlayer для UIElement перед вызовом Update().

if (AdornerLayer.GetAdornerLayer(uIElement) != null)
{
    this.adornerLayer.Update(uIElement);
}
person dvestberg    schedule 14.10.2014