在之前的一个WPF项目中,由于设置控件模板在前台xaml中读取失败,由此想到了通过反射的形式来读取该模板,首先将该模板写入一个xml文件中,然后再读取该xml文件,在这里首先介绍一下:资源和嵌入式资源的区别,嵌入资源(Embedded Resource) - 将该文件作为 DLL 或可执行文件嵌入主项目生成输出中,通过设置也可以作为程序集的一部分发布,.NET中使用外部资源时常用的方式都是使用资源文件,作为程序集的一部分发布。资源文件的读取也比较方便,字符串、图片和任何二进制数据,包括任何类型的文件都可以作为资源的项。下面介绍两种文件的读取方式。

 关于资源文件/嵌入式资源文件的读取

读取资源文件/嵌入式资源文件的一般方式为先加载资源所在的程序集,利用反射获取程序集中的外部文件数据:

1  读取资源文件名使用:string[] Assembly.GetManifestResourceNames(). 返回的是所有程序集资源清单

2 文件资源文件的读取使用System.Resources.ResourceManager类,构造函数签名:public ResourceManager(string baseName, Assembly assembly)

3 嵌入式资源文件的读取使用Assembly.GetManifestResourceStream(string name)

下面分别将前台的XML文件和代码贴出来,介绍这种读取方式。

在我们定义的嵌入式资源 AnimationTemplate.xml中具体内容如下:

<ControlTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="http://schemas.esri.com/arcgis/client/2009" >
<Canvas>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation BeginTime="0"
Storyboard.TargetName="ellipse" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleX)"
From="1" To="10" Duration="00:00:01" /> <DoubleAnimation BeginTime="0"
Storyboard.TargetName="ellipse" Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleY)"
From="1" To="10" Duration="00:00:01" /> <DoubleAnimation BeginTime="0"
Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.Opacity)"
From="1" To="0" Duration="00:00:01" />
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse Height="16" Width="16" Canvas.Left="-8" Canvas.Top="-8"
RenderTransformOrigin="0.5,0.5" x:Name="ellipse"
IsHitTestVisible="False">
<Ellipse.RenderTransform>
<ScaleTransform />
</Ellipse.RenderTransform>
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#00FF0000" />
  <GradientStop Color="#FFFF0000" Offset="0.25"/>
  <GradientStop Color="#00FF0000" Offset="0.5"/>
  <GradientStop Color="#FFFF0000" Offset="0.75"/>
  <GradientStop Color="#00FF0000" Offset="1"/>
  </RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
  <Ellipse Height="16" Width="16" Canvas.Left="-8" Canvas.Top="-8"
  Fill="#FFFF0000" x:Name="ellipse1"/>
</Canvas>
</ControlTemplate>  

后台读取的方式如下:    

Assembly ass = Assembly.GetExecutingAssembly();//获取包含当前执行的代码的程序集。
  System.IO.UnmanagedMemoryStream ums = ass.GetManifestResourceStream("GQYPGIS.Xml.AnimationTemplate.xml") as System.IO.UnmanagedMemoryStream;//嵌入式资源文件的读取,此处UnmanagedMemoryStream提供从托管代码访问非托管内存块的能力。
  byte[] bytes = new byte[ums.Length];
  ums.Read(bytes, 0, (int)ums.Length);
  string xmlString = System.Text.Encoding.UTF8.GetString(bytes);//将指定的字节数组中的字节解码成一个字符串
  xmlString = System.Text.RegularExpressions.Regex.Replace(xmlString, "^[^<]", "");
  byte[] datas = System.Text.Encoding.ASCII.GetBytes(xmlString);
  System.IO.MemoryStream ms = new MemoryStream(datas);
  MarkerSymbol symbol = new MarkerSymbol();
  symbol.ControlTemplate = (ControlTemplate)System.Windows.Markup.XamlReader.Load(ms);//读取指定Stream中的 XAML 输入,并返回作为相应对象树根的对象。 

另外再介绍一下常见的“生成操作”使用的类型以及含义:

  内容(Content) - 不编译该文件,但将其包含在“内容”(Content) 输出组中。

  编译(Compile) - 将该文件编译到生成输出中。此设置用于代码文件。

  嵌入资源(Embedded Resource) - 将该文件作为 DLL 或可执行文件嵌入主项目生成输出中。

  

通过反射来读取XML格式的ControlTemplate的更多相关文章

  1. 读取xml格式的字符串和上下文中的xml数据

    1.读取xml格式的字符串 假设有一段下面的xml格式的字符串: <xml>     <return_code><![CDATA[SUCCESS]]></re ...

  2. pdmreader支持读取xml格式的pdm文件,无法读取二进制格式的pdm文件。

    您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的 ...

  3. JAVA 读取xml格式的数据

    <?xml version="1.0" encoding="UTF-8"?> <column-enums> <type name= ...

  4. 读取xml格式文件

    $v = [xml]get-content d:\vmconfig.xml $v.Domain.Computer.Name =========================== $v.GetElem ...

  5. 用Ajax读取XML格式的数据

    ].firstChild.data);}catch(exception){ }}}}</script>

  6. R语言XML格式数据导入与处理

    数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强 ...

  7. C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的 ...

  8. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  9. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

随机推荐

  1. day15 Python函数递归,轻易不要用递归,容易搞出来内存溢出

    古之欲明明德于天下者,先治其国:欲治其国者,先齐其家:欲齐其家者,先修其身:欲修其身者,先正其心:欲正其心者,先诚其意:欲诚其意者,先致其知,致知在格物.物格而后知至,知至而后意诚,意诚而后心正,心正 ...

  2. PAT A1117 Eddington Number (25 分)——数学题

    British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, h ...

  3. CommonJS, AMD, CMD是什么及区别--简单易懂有实例

    CommonJS, AMD, CMD都是JS模块化的规范. CommonJS是服务器端js模块化的规范,NodeJS是这种规范的实现. AMD(异步模块定义)和CMD(通用模块定义)都是浏览器端js模 ...

  4. Zabbix 3.4.2 install && Configuration

    原理: 1)zabbix server:负责接收agent发送的报告信息的核心组件,所有配置.统计数据及操作数据都由它组织进行: 2)database storage:专用于存储所有配置信息,以及由z ...

  5. Objective-C autoreleasepool深入理解

    Objective-C autorelease // main.m int main(int argc, char * argv[]) { @autoreleasepool { } } clang - ...

  6. ftrace利器之trace-cmd和kernelshark

    关键词:ftrace.trace-cmd.kernelshark. trace-cmd是设置读取ftrace的命令行工具,kernelshark既可以记录数据,也可以图形化分析结果. trace-cm ...

  7. React-引入图片的方法

    方法一: import imgURL from '../../images/logo.png'; <img src={imgURL} alt="1"/> 方法二: &l ...

  8. 在属性property做一些简单的验证

    开发C#的程序,写到属性property时,我们可以在Set方法中做一些简单的规则验证: 如下面,Insus.NET写一个Age属性,只允许用户输入10以内的数字: class AA { privat ...

  9. libgdx学习记录27——线段与线段相交检测

    给定p1, p2, p3, p4四个点,p1,p2为一条线段,p3,p4为一条线段,检测其是否有交点. 可分为三种情况: 1. L2与x轴平行 2. L2与y轴平行 3. L2与坐标轴不平行. (L1 ...

  10. (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)

    说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...