Композитный WPF: отображение / скрытие просмотров? - PullRequest
1 голос
/ 29 августа 2009

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

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

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

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

1 Ответ

5 голосов
/ 29 августа 2009

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

Дэвид Вениман
Системы предвидения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...