首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棱镜RegionAdapter -移除后添加视图

棱镜RegionAdapter -移除后添加视图
EN

Stack Overflow用户
提问于 2011-02-14 15:05:32
回答 2查看 4.9K关注 0票数 2

我有一个包含AvalonDock的棱镜/wpf/mef解决方案。我创建了一个RegionAdapterBase<Pane>类,它处理从AvalonDock中创建和删除窗格。

下面是我遇到的问题:

我单击菜单中的一个按钮,一个视图在我的DocumentPane

  • I中注册并显示在我的中,单击AvalonDock中的关闭按钮关闭选项卡并删除视图
  1. 我单击相同的菜单按钮再次添加它
  2. 我收到了错误:

”指定的元素已经是另一个元素的逻辑子元素。请先断开它。

所以..。这告诉我,有些东西是我需要删除的,但我不知道它在哪里。以下是我的RegionAdapter中的一些代码:

代码语言:javascript
复制
private void OnViewsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e, IRegion region, Pane regionTarget)
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        foreach (object item in e.NewItems)
        {
            UIElement view = item as UIElement;

            if (view is ITabViewInfo)
            {
                if (view != null)
                {
                    DockableContent newContentPane = new DockableContent()
                    {
                        Content = item,
                        Title = ((ITabViewInfo)view).TabViewTitle,
                        Icon = new Image()
                        {
                            Source = new BitmapImage(((ITabViewInfo)view).TabViewIcon)
                        }.Source,
                        IsCloseable = ((ITabViewInfo)view).IsCloseable,
                        HideOnClose = ((ITabViewInfo)view).IsHideOnClose
                    };

                    newContentPane.Closed += (contentPaneSender, args) =>
                    {
                        Debug.WriteLine("Removing view from region", "Prism");
                        region.Remove(item);
                    };

                    regionTarget.Items.Add(newContentPane);
                    newContentPane.Activate();
                }
            }
        }
    } else if (e.Action == NotifyCollectionChangedAction.Remove) {
            regionTarget.Items.Clear();
    }
   }

在我的调试行中,DocumentPane和region视图被正确地销毁了.当我单击将该项添加回视图时,会在以下行获得上述错误消息:

代码语言:javascript
复制
Content = item,

下面是当按下菜单按钮时运行的模块中的代码:

代码语言:javascript
复制
    if (_regionManager.Regions["MainRegion"].Views.Any(m => m.GetType() == typeof(Views.ClassicFrontierView)))
    {
        Debug.WriteLine(_regionManager.Regions["MainRegion"].Views.Count());
    }
    else
    {
        Debug.WriteLine("Adding view to region", "Prism");
        _regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.ClassicFrontierView));
    }

知道我错过了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-14 15:57:01

我不处理关闭事件(它可能丢失了对基础视图的引用),而是处理关闭事件。

但是,当我试图重新打开选项卡时,它显示的是同一个实例。在阅读此In Composite WPF (Prism), what is the difference between IRegion.Add and IRegionManager.RegisterViewWithRegion?之后,我更改了以下内容:

代码语言:javascript
复制
_regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.ClassicFrontierView));

对此:

代码语言:javascript
复制
_regionManager.Regions["MainRegion"].Add(new Classic.Views.ClassicFrontierView());

我仍然需要对棱镜/雪崩进行一些研究,以确保不会有内存泄漏,但到目前为止,它似乎正在工作。

票数 2
EN

Stack Overflow用户

发布于 2011-02-14 15:25:40

您是每次创建一个新视图,还是尝试多次显示现有视图?如果第二个是正确的,我会尝试这样做:

代码语言:javascript
复制
else if (e.Action == NotifyCollectionChangedAction.Remove) {
    foreach (DockableContent content in regionTarget.Items)
        content.Content = null;
    regionTarget.Items.Clear();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4993705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档