문제

AvalonDock이 포함된 프리즘/wpf/mef 솔루션이 있습니다.나는 RegionAdapterBase<Pane> AvalonDock에서 창 생성 및 제거를 처리하는 클래스입니다.

내가 겪고 있는 문제는 다음과 같습니다.

  1. 내 메뉴에서 버튼을 클릭하면 보기가 지역에 등록되고 내 메뉴에 표시됩니다. DocumentPane
  2. AvalonDock에서 닫기 버튼을 클릭하여 탭을 닫고 보기를 제거합니다.
  3. 다시 추가하려면 동일한 메뉴 버튼을 클릭하세요.
  4. 오류가 발생합니다.

"지정된 요소는 이미 다른 요소의 논리적 자식입니다.먼저 연결을 끊으세요."

그래서...이것은 제거해야 할 무언가가 남아 있다는 것을 말하지만 그것이 어디에 있는지 알 수 없습니다.내 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을 사용하여 시각적 트리에서 제거되지 않은 것을 확인한 다음 요소를 제거하는 데 필요한 컨테이너를 찾으려고 시도 할 수 있습니다.기타 가능성은 삐 싼 아이콘 이미지 등의 것들입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top