我有一个包含AvalonDock的棱镜/wpf/mef解决方案。我创建了一个RegionAdapterBase<Pane>类,它处理从AvalonDock中创建和删除窗格。
下面是我遇到的问题:
我单击菜单中的一个按钮,一个视图在我的DocumentPane
“
”指定的元素已经是另一个元素的逻辑子元素。请先断开它。
所以..。这告诉我,有些东西是我需要删除的,但我不知道它在哪里。以下是我的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和region视图被正确地销毁了.当我单击将该项添加回视图时,会在以下行获得上述错误消息:
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));
}知道我错过了什么吗?
发布于 2011-02-14 15:57:01
我不处理关闭事件(它可能丢失了对基础视图的引用),而是处理关闭事件。
但是,当我试图重新打开选项卡时,它显示的是同一个实例。在阅读此In Composite WPF (Prism), what is the difference between IRegion.Add and IRegionManager.RegisterViewWithRegion?之后,我更改了以下内容:
_regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.ClassicFrontierView));对此:
_regionManager.Regions["MainRegion"].Add(new Classic.Views.ClassicFrontierView());我仍然需要对棱镜/雪崩进行一些研究,以确保不会有内存泄漏,但到目前为止,它似乎正在工作。
发布于 2011-02-14 15:25:40
您是每次创建一个新视图,还是尝试多次显示现有视图?如果第二个是正确的,我会尝试这样做:
else if (e.Action == NotifyCollectionChangedAction.Remove) {
foreach (DockableContent content in regionTarget.Items)
content.Content = null;
regionTarget.Items.Clear();
}https://stackoverflow.com/questions/4993705
复制相似问题