2

我正在实施此处提到的拖放解决方案:

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

我的ListBoxes + with WrapPaneland Items 很少。我应该能够将项目从任何盒子拖放到任何其他盒子。

当我拖动一个项目并将其移动到另一个框时,它会引发错误:

无法访问没有装饰器的元素上的装饰器。

在这一行:

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

我试图查看 AdornedElement 的值,我看到它有这个值:

ListBoxItem : DisconnectedItem. 我看到了内容,ListBoxItem似乎它也有断开连接的项目。

如果我使用相同的列表框移动我的项目,也会发生此问题。我的列表框使用 wrapPanel 作为ItemsPanelTemplate.

层次结构树是这样的列表框是:

1 列表框:UserControl Border Grid Grid Border Border Border ScrollViewer ListBox ItemsPanel

其他 3 个 ListBoxes : UserControl Border Grid Grid Grid tabControl tabItem Grid Border Border Border ScrollViewer ListBox ItemsPanel

遇到此问题或可以帮助我的任何人出了什么问题?

  • 吉里哈
4

4 回答 4

4

我也能够重现这个问题。我可以通过将代码行更改为此来防止错误停止:

if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}
于 2012-07-20T22:11:45.303 回答
1

这是一个 .Net 4.0 错误

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

您也可以在选项卡控件中看到这一点。

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

于 2011-12-07T23:56:43.887 回答
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;
        }

项目断开连接时失败。

顺便说一下,据报道该错误已在 4.5 中修复

于 2013-07-10T21:53:10.487 回答
1

在调用 Update() 之前检查是否可以找到 UIElement 的装饰层对我很有用。

if (AdornerLayer.GetAdornerLayer(uIElement) != null)
{
    this.adornerLayer.Update(uIElement);
}
于 2014-10-14T06:28:44.917 回答