zoukankan      html  css  js  c++  java
  • 通过反射来读取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 或可执行文件嵌入主项目生成输出中。

      

  • 相关阅读:
    [转]如何选购塑料水杯(塑料口杯、茶杯)
    【转】在sqlserver下增加MYSQL的链接服务器,实现分布式数据库开发第一步
    MySql: 查看当前登录用户,当前数据库
    python import, from xx import yy
    python class metaclass instance
    git: fatal: Not a git repository (or any of the parent directories): .git
    Python flask 基于 Flask 提供 RESTful Web 服务
    Python flask @app.route
    MySql: log 位置
    MySql: 忘记root密码
  • 原文地址:https://www.cnblogs.com/seekdream/p/4583146.html
Copyright © 2011-2022 走看看