本文主要说明在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. 说完Pivot 今天说下Unpivot 的处理方式

    上次说到,既然有Pivot 的行转列,那么肯定也有Unpivot 的列转行 .其实unpivot 处理的情况也是差不多,也是分3步走. 首先也是先演示一下unpivot 的用法 ),Mon TIME, ...

  2. Mac上打开拷贝到移动硬盘里的文件提示“已经被osx使用不能打开”解决办法

    在终端里面粘贴xattr -d com.apple.FinderInfo(此处按一下空格),然后把文件拖进终端窗口,按一下回车就好了

  3. C++杂谈(三)产生随机数与time函数

    产生随机数在程序中很有用,这篇文章简单介绍一下产生随机数的方法. 伪随机数 使用标准库<cstdlib>中的rand()函数产生随机数. #include<iostream> ...

  4. Android复制Assets目录下的文件到指定目录

    package com.android.demo; import java.io.File; import java.io.FileOutputStream; import java.io.Input ...

  5. 新版Microsoft Azure Web管理控制台 - Microsoft Azure New Portal - (1)

    国际版Microsoft Azure的Preview Portal已经于12月2日正式GA,现在登录国际版的Microsoft Azure,默认就会进入Microsoft Azure New Port ...

  6. vi/vim实用命令

    查找 n是下一个,N是上一个 撤销和重做 u:撤销上一步的操作 ctrl+r:恢复上一步被撤销的操作 替换 :1,$ s/aaa/bbb/g

  7. Random number

    Original #include <stdlib.h> #include <time.h> srand(time(NULL)); rand(); The versions o ...

  8. 《2016ThoughtWorks技术雷达峰会----js爆炸下的技术选型》

    JS爆炸下的技术选型  刘尚奇    ThoughtWorks, 高级咨询师 JS每6个星期出现一个新框架,那么如何进行JS的选型.以下从四个方面来分析. 1.工具 NPM for all the t ...

  9. stanford coursera 机器学习编程作业 exercise 3(逻辑回归实现多分类问题)

    本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于逻辑回归的一个编程练习,可参考:http://www.cnb ...

  10. POJ1849Two[DP|树的直径](扩展HDU4003待办)

    Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1390   Accepted: 701 Description Th ...