拖放错误:无法访问没有装饰者的元素上的装饰器

时间:2011-11-02 21:33:13

标签: wpf user-controls wpf-controls adorner

我正在实现这里提到的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列表框: 用户控件 边界 格 格 边界 边界 边界 的ScrollViewer 列表框 ItemsPanel

其他3个ListBoxes: 用户控件 边界 格 格 格 的tabcontrol TabItem的 格 边界 边界 边界 的ScrollViewer 列表框 ItemsPanel

AnyOne谁遇到过这个问题或者可以帮助我解决出错的问题?

  • 吉里贾

4 个答案:

答案 0 :(得分:4)

我也能够重现这个问题。我可以通过将代码行更改为:

来防止错误停止
if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}

答案 1 :(得分:1)

这是一个.Net 4.0错误

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

您也可以在标签控件中看到这一点。

任何时候都没有显示某些东西,一旦你从视觉树上掉下来,你的绑定就会搞砸了。

答案 2 :(得分:1)

尝试jhamm建议的方法,不幸的是,它对我的​​情况不起作用。我最后修改了微软论坛上的线程中提出的代码,如上所述:

        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;
        }
项目断开时

失败。

顺便说一下,报告的bug在4.5中被修复了

答案 3 :(得分:1)

我可以在调用Update()之前检查是否可以找到UIElement的adornerlayer。

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