2011-03-02 66 views
2

我有一個簡單的表格區域佈局的WPF應用程序如下:PRISM模塊登記

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

我想要提供給寄存器模塊基於模塊/應用配置例如能力和它們的位置在區域1中註冊「Module1」,並將其行rowspan設置爲2,以便它與區域3重疊或者可能在各個區域中註冊Module1,Module2,Module3和Module4,或者註冊Module1,以使其消耗整個網格。

我目前的想法是在Shell中定義四個區域,從XAML模塊目錄加載模塊並從app.config設置row/column/rowspan/columnspan然而,如果存在某種方式其中我可以擴展模塊目錄,以便每個模塊條目可以直接指定網格設置(很像附加的依賴屬性),然後我可以在模塊初始化過程中讀取它們,並根據需要在每個區域註冊模塊。

希望這是有道理的,如果不讓我知道,我會盡力澄清 - 我可能會過於複雜的事情!

+0

由於我不理解你想在一些可配置的row/col/rowspan/colspan組合中加載不同的視圖,但是爲什麼?你的佈局是否會經常改變? – 2011-03-02 14:17:20

+0

原理是客戶將從部件目錄購買模塊,例如新聞饋送,圖像饋送等,他們可能會購買一個,在這種情況下會希望它填滿整個屏幕,他們可能會購買2,並在這種情況下會希望佈局不同。這不是一種,而是一種儀表板方法。我認爲MEF可能會給予我比PRISM更孤立的動態選擇。 – Sidebp 2011-03-02 17:43:03

回答

2

首先,在問題中,您將模塊視圖混淆不清。一個模塊可以初始化而不添加任何視圖到你的UI,或者它可以添加幾個。所以,假設在你的情況下,一個模塊只會暴露一種類型的視圖,最好是將該設置描述爲「在Region1中添加視圖」等。

要解決您的問題,可以使用基於網格方法在你的例子中是這樣的:

  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在你希望的任何方式(從配置加載它們W值,YZ, ,如果它們不存在,則自動分配它們,讓附加模塊在「模塊初始化」事件中指定它們等等)。

+0

感謝您對答覆的回答和道歉,這是一種享受。 – Sidebp 2011-03-21 17:22:18

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中傳遞的所有視圖都將作爲具有指定屬性的網格的子項添加。