菜单管控模块EntityFW

菜单的加载采用MEF技术,程序实现思路:

1 .主菜单加载页面MainMenuView.xaml指向MenuRegion

2. 菜单Item点击及内容加载,采用订阅模式,即菜单item点击时发布消息,shell负责订阅并过滤加载子模块

MainMenuView.xaml

<UserControl x:Class="EntityFW.Views.MainMenuView"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                      
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">

<Grid x:Name="LayoutRoot" Background="White">

<ItemsControl x:Name="MenuItems" BorderBrush="Black">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <RadioButton Command="{Binding ViewMenuCommand}" CommandParameter="{Binding}" GroupName="MenuItem"
                                     Style="{StaticResource RadioButtonStyle}" VerticalContentAlignment="Center" Height="35" Padding="15,0,0,0" Margin="2,1,2,1">
                            <StackPanel>
                                <TextBlock Text="{Binding NameFL}" FontSize="10" Foreground="Gray" />
                                <TextBlock Text="{Binding NameCH}"  FontSize="14" />
                            </StackPanel>
                        </RadioButton>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

后台代码实现

using EntityFW.ViewModels;
using MyGlobal.Infrustructure;
using MyGlobal.Infrustructure.Behaviors;
using MyGlobal.Infrustructure.Interfaces;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Windows.Controls;
namespace EntityFW.Views
{
   
    /// <summary>
    /// MainMenu.xaml 的交互逻辑
    /// </summary>
    [ViewExport(RegionName = RegionNames.MenuRegion)]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public partial class MainMenuView : UserControl,IPartImportsSatisfiedNotification
    {
        private readonly ObservableCollection<MainMenuViewModel> _MenuList =
            new ObservableCollection<MainMenuViewModel>();
        [Import]
        IRegionManager _regionManager;
        public MainMenuView()
        { 
            InitializeComponent();          
        }
       
        public void OnReceiveNewMenu(MainMenuViewModel menu)
        {
            _MenuList.Insert(0, menu);
        }

public void OnImportsSatisfied()
        {

//模块加载成功
            MainMenuViewModel mmvm = new MainMenuViewModel();

//初始化主菜单
            MenuItems.ItemsSource = mmvm.InitPopMenuListData();
        }
    }
}

MainMenuViewModel.cs

using EntityFW.Events;
using EntityFW.Models;
using Microsoft.Practices.ServiceLocation;
using MyGlobal.Infrustructure;
using MyGlobal.Infrustructure.Events;
using MyGlobal.Infrustructure.Interfaces;
using Prism.Commands;
using Prism.Modularity;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace EntityFW.ViewModels
{
    [Export(typeof(MainMenuViewModel))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class MainMenuViewModel : MyBindableBase
    {

[ImportMany]
        IEnumerable<Lazy<IMainMenu, IMainMenuDepict>> _MenuList = null;
        LoginUser _User;
        public ICollection<MainMenuViewModel> InitPopMenuListData()
        {
            CompositeComponents();
            ICollection<MainMenuViewModel> list = new List<MainMenuViewModel>();
        
            //判断登录用户是否有权限
            foreach (var o in _MenuList.Where(item => (item.Metadata.Name != null || true)))
            {
                MainMenuViewModel mm = new MainMenuViewModel(o.Value.NameCH,o.Value.NameFL,o.Value.Url,o.Value.ParentUrl,o.Value.PowerKey);
              
                mm.ViewMenuCommand = new RelayCommand<MainMenuViewModel>(OnViewMainMenu);
                list.Add(mm);
            }
            return list;

}
        public void Initialize()
        {
           
        }
        void CompositeComponents()
        {

var assemblylog = new AssemblyCatalog(this.GetType().Assembly);

var aggregatelog = new AggregateCatalog();
           aggregatelog.Catalogs.Add(assemblylog);

aggregatelog.Catalogs.Add(new DirectoryCatalog("../../Modules"));          
            var container = new CompositionContainer(aggregatelog);
            container.ComposeParts(this);

//var assemblylog = new AssemblyCatalog(this.GetType().Assembly);
            ////AppDomain.CurrentDomain.BaseDirectory + "\\Parts", "*.dll"
            //var directoryCatalog = new DirectoryCatalog("../../Modules");
            ////var typeCatalog = new TypeCatalog(typeof(Class6), typeof(Class7));
            //var aggregateCatalog = new AggregateCatalog(assemblylog, directoryCatalog);

//var _container = new CompositionContainer(aggregateCatalog);

//var exports = _container.GetExports<object>();
            //string x = "";
            //foreach (var exportValue in exports)
            //{
            //    // x += exportValue.Value.GetType().ToString();
            //    Console.WriteLine(exportValue.Value.GetType());
            //}

}
        public string ModuleName
        {
            get { return "MainMenu"; }
        }
        public ICommand ViewMenuCommand { get; private set; }
     
        public MainMenuViewModel() : base("", "", "", "", 1) { }
        [ImportingConstructor]
        public MainMenuViewModel(string chName, string flName, string url, string parentUrl, int powerKey)
            : base(chName, flName, url, parentUrl, powerKey)
        {
            _User = new LoginUser();         
           
        }
   
        public void OnViewMainMenu(MainMenuViewModel obj)
        {

//发布消息
            EventAggregatorRepository.EventAggregator
                .GetEvent<ViewMainMenuEvent>()
                .Publish(obj);
            //string x = new Uri(obj.ViewUri, UriKind.Relative).AbsolutePath;

// _regionManager.RequestNavigate(RegionNames.MCWrapRegion, new Uri(obj.ViewUri, UriKind.Relative));
        }
        /****************************************/

string _MenuName;
        public string MenuName
        {
            get
            {
                return _MenuName;
            }
            set
            {
                base.SetProperty(ref _MenuName, value);
            }
        }

string _ViewUri;
        public string ViewUri
        {
            get
            {
                return _ViewUri;
            }
            set
            {
                base.SetProperty(ref _ViewUri, value);
            }
        }

}
}

Prism&MEF构建开发框架 (三)的更多相关文章

  1. Prism&MEF构建开发框架 (一)

    Shell框架XECA shell.xaml主要起到是一个容器或壳的作用 <Window x:Class="XECA.Shell"      xmlns="http ...

  2. Prism&MEF构建开发框架

    系统框架构想效果图 平台简单由左侧菜单和右侧内容区以及顶部系统和用户信息区构成 菜单根据系统模块动态加载 右侧,根据左侧选中菜单动态加载子模块,子模块集合以tab选项卡方式布局 系统模块划分为Shel ...

  3. 一步步实现 Prism + MEF(一)--- 搭建框架

    第一步:构建一个名为Bootstrapper的类作为引导程序. class Bootstrapper : MefBootstrapper { } 第二步:在MainWindow窗体中添加一个Coont ...

  4. Prism 文档 第三章 管理组件之间的依赖关系

                                                                          第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ...

  5. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

  6. UWP应用程序使用Prism框架构建MVVM

    在我们创建的UWP解决方案中选择引用->管理NuGet包程序包 NuGet管理包 2. 搜索Prism.Core,并安装 搜索Prism.Core 3. 搜索Prism.Unity,并安装 搜索 ...

  7. Docker基本命令与使用 —— Dockerfile指令与构建(三)

    一.Dockerfile指令上 1.指令格式 # Comment 注释, 以#开头 INSTRUCTION argument 以大写的指令+参数 #First Dockerfile 注释 FROM u ...

  8. 一步步实现 Prism + MEF(二)--- 绑定命令

    Prism程序集为我们提供了DelegateCommand命令,使用该命令可实现窗口直接绑定.第一步:在ViewModel中定义一个DelegateCommand属性. public Delegate ...

  9. S3C6410嵌入式应用平台构建(三)

    构建了好久的系统,由于工作原因,没有及时写记录,目前我已经进展到构建yaffs2文件系统,启动Linux内核了.Uboot移植基本功能已经完成. 由于Uboot移植方法大致是一样的,我主要参考这位博友 ...

随机推荐

  1. git学习 远程仓库02

    使用远程仓库: 查看当前远程库://克隆后,至少有一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库 git remote -v: 并显示所有远程库的地址: 添加远程仓 ...

  2. 递推DP URAL 1009 K-based Numbers

    题目传送门 题意:n位数,k进制,求个数分析:dp[i][j] 表示i位数,当前数字为j的个数:若j==0,不加dp[i-1][0]; 代码1: #include <cstdio> #in ...

  3. DFS HDOJ 2614 Beat

    题目传送门 /* 题意:处理完i问题后去处理j问题,要满足a[i][j] <= a[j][k],问最多能有多少问题可以解决 DFS简单题:以每次处理的问题作为过程(即行数),最多能解决n个问题, ...

  4. windows 8 系统部署IIS并发布网站

    企业用户可以在已经部署了windows 8 的电脑中通过部署IIS服务器来发布自己公司的企业内部网站实现对企业的网络办公的管理工作. 准备篇 IIS的添加和运行 一.IIS的添加 1.请进入“控制面板 ...

  5. xml文件读写

    创建xml文件,对xml文件进行添加新节点.删除节点.更新节点.创建的如下的xml文件. <?xml version="1.0" encoding="UTF-8&q ...

  6. CSS3 选择器——伪类选择器

    前面花了两节内容分别在<CSS3选择器——基本选择器>和<CSS3选择器——属性选择器>介绍了CSS3选择器中的基本选择器和属性选择器使用方法,今天要和大家一起学习CSS3选择 ...

  7. 【BZOJ】2152: 聪聪可可(点分治)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2152 随便点分..... 只是我在考虑一个地方逗乐.. 当路径长度mod3=0的点数直接乘起来就好. ...

  8. Oracle--10(ROW_NUMBER() OVER)

    一.定义 语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这 ...

  9. js for循环,为什么一定要加var定义i变量

    我知道,有些人(譬如之前的我)写js的for循环时,都不习惯加上var,这当然是语法允许的.譬如下面. for(i=0;i<10;i++){//就不写成: var i=0 alert(i); } ...

  10. hdu Wooden Sticks

    这题是暴力加贪心,算是一道水题吧!只要把l和w从小到大排个序就行了... #include"iostream" #include"stdio.h" #inclu ...