本文主要说明在Modern UI框架下使用MEF的必要步骤,关于MEF请自行脑补。

MEF-INTO-MUI实例代码下载: MefMuiApp.zip

1:创建一个导出属性

ModernFrame用来承载在MUI应用中显示的内容。内容是通过URI标识的,我们需要通过MEF来标记一段内容是被导出的,同时提供一个可供访问的URI标识,这可以通过元数据实现。

下面的ContentAttribute类继承自ExportAttribute,并添加了一个CotentUrl元数据属性,契约规定可导出的内容必须继承IContent接口。

为了能在MEF中使用强类型元数据,我们也定义了一个IContentMetadata接口,在后面将会用到

2:导出内容

下一步我们需要做的就是使用ContentAttribute来标记可被导出的内容页面,并且每一个页面都必须继承IContent接口。

下面的代码演示了将可被导出的MyPage指定URI为"/MyPage"。

3:继承contentLoader

我们现在需要定义一个IContentLoader的实现,能够接收导出的内容,并根据内容的URI返回接口。为此我们创建新的从DefaultContentLoader派生的MEFContentLoader,这个加载器可以导入包含了IContentMetadata和继承了IContent接口的导出内容,这样我们就可以通过URI访问了。

当通过LoadContent方法请求时,请求的uri会和元数据进行匹配,成功后内容就会被返回。Content实例通过Lazy进行延迟加载。

请注意MefContentLoader本身也有出口。

4:把他们放在一起

所有必须的元素已经准备就绪,我们现在要做的就是确保所有的Modern控件使用新的MefContentLoader而不是默认的contentLoader,在App.xaml中添加下面的默认样式。动态资源的引用问题将在后面解决。

MEF在应用启动时进行组合,将下面的代码添加到应用启动方法中(App.xaml.cs的OnStartup方法)

MEF组合需要创建的程序集目录并将其填充到CompositionContainer容器中,从容器中检索MefContentLoader实例并将其添加到全局应用程序资源字典中,一旦这个加载器被加载,在默认样式中使用动态资源的问题就被解决了。

就是如此。每当ModernFrame需要加载内容时,它就用在默认样式中定义的MefContentLoader,MefContentLoader根据ContentUri在导出的元数据中进行查找。

ModernUI教程:MEF应用向导的更多相关文章

  1. ModernUI教程:目录 (完结)

    入门 My first Modern UI app (manually)                         第一个ModernUI应用(手动编写)(已完成) My first Moder ...

  2. ModernUI教程:独立显示器DPI感知

             独立显示器DPI感知,是在Windows 8.1中新增的特性,这个特性针对拥有多个显示器同时各个显示器的DPI设定又不同的人.对这个新特性做了优化支持的软件能够在一个高DPI的显示器 ...

  3. ModernUI教程:创建自定义主题

            Modern UI WPF包括两个内置主题(dark与light).在1.0.3版本,您可以构建自定义的主题.Modern UI应用程序通常有在全局资源字典App.xaml中有如下定义 ...

  4. ModernUI教程:如何使用你自己的导航框架

         Modern UI for WPF带有一个内置的页面导航框架,易于使用和可扩展的.但这并不是必须的,你也可以自己来自定义一个导航框架.      默认的ModernWindow控件模板包括标 ...

  5. Django Rest Framework 教程及API向导

    Django Rest Framework 教程及API向导. 一.请求(Request)REST_FRAMEWORK 中的 Request 扩展了标准的HttpRequest,为 REST_FRAM ...

  6. ModernUI教程:处理内容导航事件

    Modern UI包含了一个机遇uri的内容导航框架用来处理区域加载.卸载和处理访问记录页面间的导航. 如果你希望你的页面具有这些处理事件,你需要继承一个IContent接口,该接口位于FirstFl ...

  7. ModernUI教程:第一个ModernUI应用(手动编写)

    这篇文章带着我们从头开始创建一个Modern UI应用.有关采用项目模板和项模板创建Modern UI应用请参看  第一个ModernUI应用(采用项目模板). 1:获取最新的ModernUI发布并解 ...

  8. ModernUI教程:第一个ModernUI应用(采用项目模板)

    在我们开始之前,请确保你已经为你的Visual2012或者2013安装了ModernUI for WPF的模板扩展: >>从Visual Studio 库 下载并安装VSIX扩展 > ...

  9. ModernUI教程:主题资源引用

    已经完成的主题资源列表 提示:请关注Modern UI的开发工作,资源文件可能在演进版本中新增和删除. 资源列表可以去访问原文,原文可复制,该表未改动原文. 查看目录

随机推荐

  1. .NET/ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  2. storm实战:基于storm,kafka,mysql的实时统计系统

    公司对客户开放多个系统,运营人员想要了解客户使用各个系统的情况,在此之前,数据平台团队已经建设好了统一的Kafka消息通道. 为了保证架构能够满足业务可能的扩张后的性能要求,选用storm来处理各个应 ...

  3. 《PHP开发APP接口》笔记

    PHP开发APP接口 [TOC] 课程地址 imooc PHP开发APP接口 学习要点 APP接口简介 封装通信接口方法 核心技术 APP接口实例 服务器端 -> 数据库|缓存 -> 调用 ...

  4. ubuntu16.04下vim安装失败

    问题? 重装了ubuntu系统,安装vim出现了以下问题:   sudo apt-get install vim   正在读取软件包列表... 完成 正在分析软件包的依赖关系树        正在读取 ...

  5. 错误 未能找到类型或命名空间名称 (是否缺少 using 指令或程序集引用?)

    有时发现,明明引用了,结果却提示未引用, 这时就有可能是两个程序集的目标框架类型不一致导致的(在程序集属性面板里改下即可).

  6. Android gdb 调试

    [1].终端目录设置到: proj.android[2].make文件的编译选项加上: -g -gstabs+[3].执行编译脚本: sh ./build_native.sh NDK_DEBUG=1[ ...

  7. 编译Ansj之Solr插件

    Ansj是一个比较优秀的中文分词组件,具体情况就不在本文介绍了.ansj作者在其官方代码中,提供了对lucene接口的支持.如果用在Solr下,还需要简单的扩展一下. 1.基于maven管理 ansj ...

  8. 使用ajaxfileupload.js上传文件

    一直以来上传文件都是使用form表单上传文件,也看到过有人使用js上传文件,不过看起来蛮简单的也就没有怎么去理会.今天突然要使用这种方式上传文件,期间还遇到点问题.因此就记录下来,方便以后遇到这样的问 ...

  9. 用pygame学习初级python(二) 15.5.11

    闲得无聊,对第一版的东西做了一些修改,让它更像一个游戏,也具有一些可玩性. 项目的github地址:https://github.com/lfkdsk/BrainHole_pygame 1.人物类进行 ...

  10. 经典DOS游戏皇帝攻略(曾经的回忆)

    最完美攻略>>>>> -------------------------------------------------------------------------- ...