Prism RegionAdapter - 뷰 제거 후 추가
-
13-11-2019 - |
문제
AvalonDock이 포함된 프리즘/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));
}
내가 무엇을 놓치고 있는지 아시나요?
해결책 2
닫힌 이벤트 (기본보기에 대한 참조를 잃어 졌을 수 있음)를 처리하는 대신 닫는 이벤트를 처리합니다.
이 작업을 수행했지만 탭을 다시 열려고했을 때 동일한 인스턴스를 표시했습니다.이 복합 WPF에서 읽는 후(프리즘), iRegion.add와 iregionmanager.registerviewWithRegion의 차이점은 무엇입니까?
_regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.ClassicFrontierView));
.
다음과 같이 :
_regionManager.Regions["MainRegion"].Add(new Classic.Views.ClassicFrontierView());
.
필자는 프리즘 / Avalondock에 대한 연구를 수행해야합니다. 메모리 누수가 없는지 확인하기 위해서는 이제는 작동하는 것처럼 보입니다.
다른 팁
매번 새로운보기를 만들거나 기존보기를 여러 번 표시하려고 시도합니까?두 번째가 맞으면 이렇게 할 것입니다 :
else if (e.Action == NotifyCollectionChangedAction.Remove) {
foreach (DockableContent content in regionTarget.Items)
content.Content = null;
regionTarget.Items.Clear();
}
. regionTarget
에서도 제거해야 할 것입니다.
Snoop을 사용하여 시각적 트리에서 제거되지 않은 것을 확인한 다음 요소를 제거하는 데 필요한 컨테이너를 찾으려고 시도 할 수 있습니다.기타 가능성은 삐 싼 아이콘 이미지 등의 것들입니다.