Составной WPF: отображение / скрытие представлений?

Я быстро осваиваю Composite WPF, создаю небольшое демонстрационное приложение для решения проблем. В моем приложении один регион и два модуля, модуль A и модуль B. Каждый модуль содержит простой текстовый блок «Hello World». Оба модуля настроены как загрузка по требованию в соответствии с этим инструкциям MSDN. Куда.

На оболочке есть две кнопки: «Загрузить модуль A» и «Загрузить модуль B». При нажатии кнопки загружается соответствующий модуль. Итак, допустим, я нажимаю «Загрузить модуль A», затем «Загрузить модуль B». Модуль A, затем модуль B загружаются должным образом. Но если я снова нажму «Загрузить модуль A», ничего не произойдет.

Я застрял на этом этапе. Я думаю, что моя проблема в том, что мне нужно активировать и деактивировать представления в модулях, а не использовать загрузку по требованию. Но я понятия не имею, как это сделать, и я не могу найти никакой документации или блогов, в которых говорится об этом.

Итак, вот мой вопрос: как загрузить / выгрузить (или показать / скрыть) представления? Если кто-то может указать мне на образец кода, я буду очень признателен. Спасибо за вашу помощь.


person David Veeneman    schedule 29.08.2009    source источник


Ответы (1)


Я нашел свой ответ. Вот подход: загружайте все модули при запуске, затем активируйте и деактивируйте представления по мере необходимости. Я собираюсь написать об этой проблеме в виде статьи 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) При активации представления нам нужно деактивировать предыдущее представление. Но мы можем не знать имя представления, поэтому деактивируем все активные представления:

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);
    }
}

Поскольку мы устанавливаем имя каждого представления равным его значению ToString (), мы можем легко получить имена, ничего не зная о них заранее.

(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.

Дэвид Винеман
Foresight Systems

person David Veeneman    schedule 29.08.2009