2011-03-02 62 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中传递的所有视图都将作为具有指定属性的网格的子项添加。