Ошибка перетаскивания: невозможно получить доступ к элементам декорации на элементе, который не содержит элементов декорации - PullRequest
2 голосов
/ 03 ноября 2011

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

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

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

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

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

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

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

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

ListBoxItem : DisconnectedItem. Я увидел содержимое ListBoxItem и, похоже, он также отключил элемент.

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

иерархическое дерево похоже на список списков:

1 Список: UserControl бордюр сетка сетка бордюр бордюр бордюр ScrollViewer ListBox ItemsPanel

Другие 3 списка: UserControl бордюр сетка сетка сетка TabControl TabItem сетка бордюр бордюр бордюр ScrollViewer ListBox ItemsPanel

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

  • Гиридж

Ответы [ 4 ]

4 голосов
/ 21 июля 2012

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

if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}
1 голос
/ 14 октября 2014

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

if (AdornerLayer.GetAdornerLayer(uIElement) != null)
{
    this.adornerLayer.Update(uIElement);
}
1 голос
/ 11 июля 2013

Попробовал подход, предложенный 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

1 голос
/ 08 декабря 2011

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

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

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

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

...