PRISM модуль регистрации - PullRequest
       38

PRISM модуль регистрации

2 голосов
/ 02 марта 2011

У меня есть приложение WPF с простой табличной схемой расположения регионов:

-----------------------------
|   Region 1  |   Region 2  |
-----------------------------
|   Region 3  |   Region 4  |
-----------------------------

Я хочу предложить возможность регистрировать модули и их положение на основе конфигурации модуля / приложения, например, зарегистрировать «Модуль1» вОбласть 1 и установите для его диапазона строк значение 2, чтобы он перекрывал область 3 или, возможно, зарегистрируйте Module1, Module2, Module3 и Module4 в соответствующих регионах или, альтернативно, зарегистрируйте Module1 так, чтобы он занимал всю сетку.

В настоящее время я думаю, чточтобы определить четыре области в командной консоли, загрузите модули из каталога модулей XAML и установите row / column / rowspan / columnspan из app.config, однако было бы идеально, если бы я мог каким-то образом расширить каталог модулейчтобы каждая запись модуля могла напрямую указывать настройки сетки напрямую (во многом как присоединенные свойства зависимостей), я мог затем прочитать их во время инициализации модуля и зарегистрировать модули в каждой области по мере необходимости.

Надеюсь, что это имеет смысл, если нетдай мне знать и яПопробую уточнить - я вполне могу усложнять вещи!

Ответы [ 3 ]

2 голосов
/ 03 марта 2011

Прежде всего, в вопросе вы путаете представления с модулями.Модуль может быть инициализирован без добавления каких-либо представлений в ваш пользовательский интерфейс, или он может добавить несколько.Итак, предполагая, что в вашем случае модуль будет отображать только один тип представления, было бы лучше описать настройку как «добавить представление1 в Region1» и т. Д.подход, основанный на вашем примере, такой:

  1. Объявите вашу таблицу в XAML с таким количеством ячеек / областей, как вы хотите, как в вашем примере. (Так как ваше приложение будет иметь очень динамичный макет, это лучше сделать вручную в коде. Но если вы хотите принять некоторые жесткие ограничения на строки / столбцы, XAML тоже будет работать нормально и будет проще)
  2. Определите Событие Prism , которое ваши дополнительные модули будут использовать для уведомления «основного» модуля о том, что они были инициализированы.Мастер-модуль будет загружен перед любым дополнительным модулем и позаботится о макете.При вызове этого события дополнительные модули будут включать типы представлений, с которыми они настроили контейнер, как часть аргументов события.
  3. При инициализации мастер-модуль подпишется на событие «модуль инициализирован»,Всякий раз, когда возникает событие (дополнительный модуль был инициализирован), мастер-модуль разрешает представление соответствующего типа из контейнера (помните: дополнительный модуль сообщил нам, какой тип представления следует разрешить).

Тогда достичь цели очень просто:

var view = container.Resolve(typeOfViewFromAddOnModule);
var uiElement = (UIElement)view; // because that's what it's going to be
Grid.SetColumn(uiElement, X);
Grid.SetRow(uiElement, Y);
Grid.SetColumnSpan(uiElement, Z);
Grid.SetRowSpan(uiElement, W);
var region = // get a reference to your Grid region here
region.Add(view);

Вы можете свободно определять значения X, Y, Z, W любым способом, который вы пожелаете (загрузить их из конфигурации, автоматически назначить их, если они отсутствуют, попросить дополнительный модуль указать их в событии «инициализирован модуль» и т. Д.).

1 голос
/ 03 марта 2011

Используйте подход представления представления, в котором у вас будет IGridLayoutService с методом AddView(object content, int row, int col, int rowSpan, int colSpan);

так что у вас будет один регион, которым управляет какой-то класс, реализующий IGridLayoutService, который добавляет в него одно представление с Grid. Все представления, переданные в AddView, добавляются как дочерние элементы сетки с указанными свойствами.

1 голос
/ 03 марта 2011

Для вашего случая использования я бы хотел вместо установки четырех областей в сетке установить только одну область в ItemsControl с некоторыми ItemsPanelTemplate в соответствии с вашими требованиями макета, например WrapPanel, например:

<ItemsControl regions:RegionManager.RegionName="SomeRegion">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate> <toolkit:WrapPanel /> </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
...