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));
}
私が欠けているものはありますか?