在区域中加载模块默认视图以创建菜单

时间:2010-02-24 12:12:13

标签: wpf views prism region

我正在构建一个M-V-VM应用程序,在运行时动态加载模块。

这些模块中的每一个都有一个默认视图,当我去

时,它们会单独显示在所选区域上
_regionManager.Regions["BottomMenuRegion"].Add(
    Container.Resolve<AdminModuleView>(), "AdminView", true);

但是,当下一个模块加载时,它会覆盖以前加载的视图。如何将多个视图加载到某个区域,以便创建一个显示默认视图的“菜单”? e.g

<ItemsControl cal:RegionManger.RegionName="BottomMenuRegion" />

看起来像

Module1View Module2View Module3View Module4View等

提前感谢你。

2 个答案:

答案 0 :(得分:1)

我设法通过创建StackPanelRegion适配器并使用以下XAML

来完成此操作
 <StackPanel  Orientation="Horizontal"
            cal:RegionManager.RegionName="BottomMenuRegion" >

            <ItemsControl>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel >

区域适配器代码此处适用于相同情况的人

 public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
    {
        public StackPanelRegionAdapter(IRegionBehaviorFactory behaviorFactory) :
            base(behaviorFactory)
        {
        }
        protected override void Adapt(Microsoft.Practices.Composite.Regions.IRegion region, StackPanel regionTarget)
        {
            region.Views.CollectionChanged += (s, e) =>
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                    foreach (FrameworkElement element in e.NewItems)
                        regionTarget.Children.Add(element);
                //Handle remove event as well.. 
            };
        }

        protected override Microsoft.Practices.Composite.Regions.IRegion CreateRegion()
        {
            return new AllActiveRegion();
        }
    }

答案 1 :(得分:0)

如果我理解你,你正试图加载到一个区域,但当你将对象加载到该区域时,它们会相互覆盖?

您无法将多个视图加载到一个区域中。如果您想要显示一个显示其他视图的菜单,则必须创建两个区域并创建自己的菜单。将显示代码的菜单放入ModuleInit,然后将一些代码添加到菜单项的单击事件中,这些事件会将其他视图加载到不同的“MainRegion”