2009-08-29 6 views
1

Composite WPF에서 속도를 높이고 문제를 해결할 수있는 작은 데모 앱을 제작하고 있습니다. 내 응용 프로그램에는 하나의 영역과 두 개의 모듈 인 Module A와 Module B가 있습니다. 각 모듈에는 간단한 "Hello World"텍스트 블록이 있습니다. 두 모듈은 this MSDN How-To에 따라로드 온 디맨드로 설정됩니다.복합 WPF :보기 표시/숨기기?

셸에는 두 개의 버튼 "로드 모듈 A"및 "로드 모듈 B"가 있습니다. 버튼을 클릭하면 해당 모듈이로드됩니다. 그래서 "Load Module A"를 클릭하고 "Module B를로드하십시오"라고 말하게하십시오. 모듈 A, 모듈 B가 예상대로로드됩니다. 그러나 "모듈로드"를 다시 클릭하면 아무 일도 일어나지 않습니다.

나는 지금 막 붙어있다. 내 문제는로드 - 온 - 디맨드를 사용하는 대신 모듈의 뷰를 활성화 및 비활성화해야한다는 것입니다. 하지만 어떻게 해야할지 모르겠다. 나는 그것에 대해 이야기하는 문서 나 블로그를 찾을 수 없다.

그래서, 여기 내 질문 :보기를로드/언로드 (또는 표시/숨기기)하는 방법? 누군가가 샘플 코드를 가르쳐 줄 수 있다면 정말 고맙겠습니다. 당신의 도움을 주셔서 감사합니다.

답변

5

내 대답을 찾았습니다. 접근 방식은 다음과 같습니다. 시작할 때 모든 모듈을로드 한 다음 필요에 따라보기를 활성화 및 비활성화합니다. 이 문제를 CodeProject 기사로 작성 하겠지만 다음은 코드 작성 방법에 대한 개요입니다.

(1) 모듈 Initialize() 메소드에서 모듈을 추가하지만 활성화하지는 마십시오.

public void Initialize() 
{ 
    // Get main region 
    var mainRegion = m_RegionManager.Regions["MainRegion"]; 

    // Load Module B 
    var newView = new ModuleBView(); 
    mainRegion.Add(newView, "ModuleA.ModuleAView"); 
} 

Add() 메서드에는 두 개의 매개 변수가 있습니다. 두 번째 매개 변수는 뷰의 이름이며 뷰의 ToString() 메서드에서 생성 한 값으로 설정됩니다. 우리는 왜 다음 단계로 나아갈 지 알게 될 것입니다.

(2)보기를 활성화 할 때 이전보기를 비활성화해야합니다. 그러나 우리는보기의 이름을 알 수 없습니다, 그래서 우리는 모든 활성 뷰를 비활성화 : 우리는() 값을, 우리는 아무것도 모른 채 이름을 쉽게 얻을 수의 ToString와 같은 각 뷰의 이름을 설정 때문에

public static void ClearRegion(IRegion region) 
{ 
    // Get existing view names 
    var oldViewNames = new List<string>(); 
    foreach (var v in region.Views) 
    { 
     var s = v.ToString(); 
     oldViewNames.Add(s); 
    } 

    // Remove existing views 
    foreach (var oldViewName in oldViewNames) 
    { 
     var oldView = region.GetView(oldViewName); 
     region.Deactivate(oldView); 
    } 
} 

그들에 대해 사전에.

(3) 이제 새보기를 활성화합니다. 나는 MVVM ICommand.Execute() 메소드를 수행

public void Execute(object parameter) 
{ 
    // Get main region 
    var mainRegion = m_ViewModel.RegionManager.Regions["MainRegion"]; 

    // Clear region 
    ModuleServices.ClearRegion(mainRegion); 

    // Activate Module A view 
    var moduleAView = mainRegion.GetView("ModuleA.ModuleAView"); 
    mainRegion.Activate(moduleAView); 
} 

바라 건데, 그게 당신이 가야하기에 충분합니다. 내가 말했듯이, 나는 CodeProject를위한 데모 코드로 더 완전한 writeup을 할 계획이다.

데이비드 비니 만
프리시전 시스템

관련 문제