WPF 动态加载主题由zip
2024-08-28 07:07:49
经典主题的方式
主题战略 |
加载速度 |
本机支持 (不需要额外的代码) |
支持代码为主题 (捆绑代码 & 资源成单独的文件) |
支持资源层次结构中导航 |
动态加载 |
动态卸载 |
轻松地编辑和编译 (不需要安装 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") };
}
}
}
最新文章
- Third Day(上班第四天):Android开发环境配置问题相关
- ios10新特性-UserNotification
- Javascript 异步编程的4种方法
- Maven 私有库 Nexus的安装
- flex中实现自动换行
- JS 获取浏览器和屏幕宽高等信息代码
- Jordan Lecture Note-10: Kernel Principal Components Analysis (KPCA).
- poj 1041 John&#39;s trip 欧拉回路
- asp.net上传控件使用
- unity3d 学习过程记录
- 【重学计算机】计组D3章:运算方法与运算器
- python爬虫中scrapy框架是否安装成功及简单创建
- ORA-08104
- jmeter—PerfMon Metrics Collector(附java.io.IOException: Agent is unreachable via TCP错误解决办法)
- Python3基础 time 索引值访问元组中的年月日时分秒
- HTML5 historyState pushState、replaceState
- for、for..in、forEach、$.each等循环性能测试
- vuejs、eggjs、mqtt全栈式开发设备管理系统
- spring boot2 使用log4j2
- SQL Server ->;>; 重命名数据库
热门文章
- CodeForces Div1: 995 D. Game(数学期望)
- ACM学习历程—HDU4725 The Shortest Path in Nya Graph(SPFA &;&; 优先队列)
- bzoj 2216: Lightning Conductor 单调队列优化dp
- 【算法模板】Binary Search 二分查找
- 数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)
- 基于STM32的uCGUI移植和优化
- strlen("汉字")的值是多少
- ENFP喜欢的职业
- Ubuntu&;nbsp;12.04&;nbsp;Eclipse设…
- Struts&;nbsp;result&;nbsp;param详细设置