我有一个包含 AvalonDock 的 prism/wpf/mef 解决方案。我创建了一个RegionAdapterBase<Pane>
类来处理从 AvalonDock 创建和删除窗格。
这是我遇到的问题:
- 我单击菜单中的一个按钮,一个视图注册到一个区域并显示在我的
DocumentPane
- 我单击 AvalonDock 中的关闭按钮以关闭选项卡并删除视图
- 我单击相同的菜单按钮再次将其添加回来
- 我收到错误:
“指定元素已经是另一个元素的逻辑子元素。先断开它。”
所以......这告诉我有东西挥之不去,我需要删除,但我不知道它在哪里。下面是我的 RegionAdapter 中的一些代码:
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
视图和区域视图正在被正确销毁......当我单击以将项目添加回视图时,我在以下行中收到上述错误消息:
Content = item,
这是按下菜单按钮时运行的模块中的代码:
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));
}
知道我错过了什么吗?