经典主题的方式

主题战略

加载速度

本机支持 (不需要额外的代码)

支持代码为主题 (捆绑代码 & 资源成单独的文件)

支持资源层次结构中导航

动态加载

动态卸载

轻松地编辑和编译 (不需要安装 VS)

直接负载

快速

Y

Y

Y

Y

N

N

松散 Xaml

Y

N

Y

Y

Y

Y

AppDomain

快速

N

Y

N

Y

Y

N

项目资源目录截图:

2.添加/删除自定义分析器包协议

  PackageStore.AddPackage(new Uri("customtheme://"), Package.Open("123.zip"));
PackageStore.RemovePackage(new Uri("customtheme://"));

3.7za命令行压缩方式

7za.exe

a

-tzip

theme1.customtheme

.\Themes\theme1\*

-m m = 复制

 

添加/替换 zip 中的文件

使用 zip 压缩算法

目的地 zip 文件中,可以更改扩展名

要压缩的源文件

压缩策略,只复制,不做压缩以提高 decompress 速度

>cd C:\Users\rhg\Desktop\ThemeInZip\7za920

>7za.exe a -tzip theme1.customtheme C:\Users\rhg\Desktop\ThemeInZip\Themes\theme1\* -m m = 复制

4.我使用MemoryMappedFile来提高 IO 访问速度,因为有很多小大小 IO 访问当 Xaml 加载的主题文件。

  public MainWindow()
{
InitializeComponent();
//PackageStore.AddPackage(new Uri("customtheme://"), Package.Open("123.zip"));
cmbThemes.ItemsSource = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Themes").EnumerateFileSystemInfos("*.customtheme", SearchOption.TopDirectoryOnly).Select((fi) => fi.FullName).ToList(); } private void cmbThemes_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.RemovedItems != null)
{
foreach (var item in e.RemovedItems.OfType<string>())
{
PackageStore.RemovePackage(new Uri(System.IO.Path.GetFileName(item) + "://"));
}
} if (e.AddedItems != null)
{
foreach (var item in e.AddedItems.OfType<string>())
{
Stream fileMapViewStream;
try
{
//FileStream fs = File.Open(item.Replace("\\", ":"), FileMode.OpenOrCreate);
fileMapViewStream = MemoryMappedFile.OpenExisting(item.Replace("\\", ":"), MemoryMappedFileRights.Read).CreateViewStream(, new FileInfo(item).Length, MemoryMappedFileAccess.Read);
}
catch(IOException)
{
fileMapViewStream = MemoryMappedFile.CreateFromFile(item, FileMode.Open, item.Replace("\\", ":"), new FileInfo(item).Length, MemoryMappedFileAccess.Read).CreateViewStream(, new FileInfo(item).Length, MemoryMappedFileAccess.Read);
}
PackageStore.AddPackage(new Uri(System.IO.Path.GetFileName(item) + "://"), Package.Open(fileMapViewStream, FileMode.Open, FileAccess.Read));
Application.Current.Resources.MergedDictionaries[] = new ResourceDictionary() { Source = new Uri("pack://" + System.IO.Path.GetFileName(item) + ":,,,/ResourceDictionary.xaml") };
}
}
}

WPF 动态加载主题由zip的更多相关文章

  1. 044. asp.net主题之三应用或禁用主题和动态加载主题

    1.为单个页面指定主题可以将@Page指令的Theme或StyleSheetTheme属性设置为要使用的主题名称, 代码如下: <%@ Page Theme ="MyTheme&quo ...

  2. WPF动态加载3D 放大-旋转-平移

    原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DW ...

  3. WPF动态加载3D 放大-旋转-平移

    第一步:新建WavefrontObjLoader.cs using System; using System.Collections.Generic; using System.Windows; us ...

  4. 044. asp.net主题之二为主题添加CSS样式和动态加载主题

    1. 新建任意一个网站, 默认主页为Default.aspx, 增加一个App_Themes目录, 用于存储主题, 添加一个MyTheme的主题, 在MyTheme主题下添加一个样式表文件, 默认名称 ...

  5. ASP.NET加载主题和皮肤样式的各种方式

    一.加载主题(皮肤.样式表)的多种方式 除了在页面指令中采用Theme或者StylesheetTheme为单个页面加载主题外,还可以通过配置文件为多个页面批量加载主题,另外,还可以通过改变页面的The ...

  6. WPF 3D动态加载模型文件

    原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...

  7. [WPF学习笔记]动态加载XAML

    好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...

  8. mvvm模式下在WPF项目中动态加载项目的程序集和类

    在mvvm模式的wpf项目中有个需求需要去加载解决方案的程序集,并且根据程序集去动态加载当前程序集的类,做成下拉框形式. 效果: //全局定义 private ComboBox abList= nul ...

  9. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

随机推荐

  1. bzoj 3230 相似子串 —— 后缀数组+二分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 先算出每个后缀贡献子串的区间: 然后前缀LCP直接查询,后缀LCP二分长度,查询即可: ...

  2. Python 静态方法和类方法的区别

    python staticmethod and classmethod Though classmethod and staticmethod are quite similar, there’s a ...

  3. 数据库和ADO

    数据库语言 数据库的简易流程(数据库客户端软件和数据库服务软件的执行流程) 主键的概念 如何创建主键 如何创建外键 主外键关系的概念以及使用 数据库的主要类型 数据库的主要数据类型 使用SQL语句来创 ...

  4. Windows下搭建svn服务器端--创建自…

    Windows下搭建svn服务器端 1.软件 1)服务端:Subversion subversion.apache.org - Getting Subversion - Binary Packages ...

  5. 《深入分析Java Web技术内幕》读后感(Tomcat)

    第11章 P286 Tomcat总体结构 1.service 2.server 3.组件的生命 Connector Container 1.容器的总体设计 2.Engine容器 3.Host容器 4. ...

  6. winform防止界面卡死的三种方法

    在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlig ...

  7. MVC动态生成的表单:表单元素比较多 你就这样写

    MVC动态生成的表单:表单元素比较多 你就这样写: public ActionResult ShoudaanActionResult(FormCollection from,T_UserM user) ...

  8. 基于zookeeper实现分布式配置中心(一)

    最近在学习zookeeper,发现zk真的是一个优秀的中间件.在分布式环境下,可以高效解决数据管理问题.在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具.本文首先 ...

  9. Mac下安装rJava,xlsx,ReporteRs包

    xlsx包可以用来读取excel数据,ReporteRs包可以用来直接输出word报告,这两个包都对rJava包有依赖,所以必须先安装rJava. (1)查看mac的java信息 java版本: &g ...

  10. 2014-11-1 NOIP模拟赛1

    冲刺NOIP2014复赛模拟题第六套第二试   题目名称 日历游戏 最大公约数 密码 英文代号 calendar gcd pasuwado 输入文件名 calendar.in gcd.in pasuw ...