2011-03-02 3 views
2

У меня есть приложение WPF с простым табличным макетом области выглядит следующим образом:PRISM модуль регистрация

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

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

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

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

+0

Как я понимаю, вы хотите загрузить различные виды в некоторой настраиваемой комбинации row/col/rowspan/colspan, но почему? Является ли ваш макет так часто меняться? –

+0

Принцип заключается в том, что клиент будет приобретать модули из каталога компонентов, например. лента новостей, фид изображений и т. д., они могут приобрести один, в этом случае он захочет, чтобы он заполнил весь экран, они могут приобрести 2 и в этом случае потребуется, чтобы макет был другим. Это не одно, но подумайте о подходе к приборной панели. Я думаю, что MEF может дать мне более динамичные варианты, чем PRISM в изоляции. – Sidebp

ответ

2

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

Для решения вашей проблемы вы можете использовать Grid-based в вашем примере:

  1. Объявление вашей сетки в XAML с таким количеством ячеек/регионов, сколько вы хотите, точно так же, как ваш пример. (Поскольку ваше приложение будет иметь очень динамичный макет, это может быть лучше сделано вручную в коде. Но если вы согласны принять некоторые жесткие ограничения строки/столбца, XAML будет работать отлично, и это будет проще)
  2. Определите Prism event, который ваши дополнительные модули будут использовать, чтобы уведомить об этом «главный» модуль, который был инициализирован. Главный модуль загружается перед любым дополнительным модулем и заботится о макете. При создании этого события дополнительные модули будут включать типы представлений, которые они сконфигурировали для контейнера, с частью аргументов события.
  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 любым способом вы хотите (загрузить их из конфигурации , автоматически назначьте их, если они не присутствуют, добавьте модуль надстройки в «инициализированный модуль» и т. д. и т. д.).

+0

Спасибо за ответ и извинения за медленный ответ - работает. – Sidebp

1

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

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

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

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

Смежные вопросы