通过反射来读取XML格式的ControlTemplate

在之前的一个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 或可执行文件嵌入主项目生成输出中。

  

时间: 2024-08-30 13:26:43

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

读取xml格式文件

$v = [xml]get-content d:\vmconfig.xml $v.Domain.Computer.Name vmconfig.xml内容: <?xml version="1.0" encoding="UTF-8"?><Domain><Computer><Name>stcmm-vm-s01</Name><IpAddress>192.168.0.2</IpAddress>

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

1.读取xml格式的字符串 假设有一段下面的xml格式的字符串: <xml>     <return_code><![CDATA[SUCCESS]]></return_code>     <return_msg><![CDATA[OK]]></return_msg> </xml> 定义类ClientResponseHandler.cs public class ClientResponseHandler { p

C#读取XML格式的字符串

不要怪我水平低,其实真不高.....呵呵 在网上一搜读取xml文件的方法,挺多的.但我想的是直接读取XML格式的字符串,今天知道怎么弄了,现在分享下. 假如message就是我们想读取的字符串. 可以这么写: var doc = new System.Xml.XmlDocument(); //实例化XmlDocument,怎么用这个,网上去查查 doc.LoadXml(message);//加载数据 string code = doc.SelectSingleNode("ROOT/HEAD/CO

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

您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的就是将bin格式的pdm文件转换为xml格式的pdm文件.如下图.(建议使用PowerDesigner12版本进行转换) 1.转换为XML格式很简单, 用PowerDesigener 12.0(下载PowerDesigner12),打开 您的*.PDM文件    2.选择FILE,然后选择save

用Ajax读取XML格式的数据

<script type="text/javascript">var xmlHttp; function createXMLHttpRequest(){if(window.ActiveXObject){xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");}else if(window.XMLHttpRequest){xmlHttp = new XMLHttpRequest();}} function star

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

数据解析 XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用的工具.它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引.排序.查找.相关一致性等,它仅仅是存储数据.事实上它与其他数据表现形式最大的不同是:它极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同. 针对XML格式数据,R语言XML包可以对其进行数据导入与处理,详见下面的案例说明. 案例1 直接输入一段标

PHP导入与导出xml格式的Excel

1 简介 1.1 导出 在实际的工作项目中,经常需要将一些重要的数据库中存的数据导出成Excel,比如导出考勤报表,导出财务报表,导出业绩报表,导出销售报表等.CleverCode以前使用了两年的PHPExcel来制作Excel导出数据,但发现用PHPExcel生成Excel实在是太麻烦了,特别是控制单元格的颜色,合并单元格,给单元格设置长度等.这些设计一个Excel通常会需要花费一天的时间.后来CleverCode发现了一个简便的方法PHP导出xml格式的Excel,以前需要一天的工作量,现在

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

var num = 1;    var str = '1';    var test = 1;    test == num  //true 相同类型 相同值    test === num //true 相同类型 相同值    test !== num //false test与num类型相同,其值也相同, 非运算肯定是false    num == str  //true 把str转换为数字,检查其是否相等.    num != str  //false == 的 非运算    num ==

rapidxml读取utf-8 格式xml乱码问题(utf-8格式转GBK)

1.我是用rapidxml文件读取utf-8格式的xml,但是显示乱码.我们需要把读出来的内容转为GBK格式,则能正常显示. char * utf82gbk(char* strutf) { //utf-8转为Unicode int size = MultiByteToWideChar(CP_UTF8, 0, strutf, -1, NULL, 0); WCHAR   *strUnicode = new   WCHAR[size]; MultiByteToWideChar(CP_UTF8, 0,