首页 > 其他 > 详细

WPF 动态加载主题由zip

时间:2014-04-05 02:59:42      阅读:557      评论:0      收藏:0      [点我收藏+]

经典主题的方式

主题战略

加载速度

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

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

支持资源层次结构中导航

动态加载

动态卸载

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

直接负载

快速

Y

Y

Y

Y

N

N

松散 Xaml

Y

N

Y

Y

Y

Y

AppDomain

快速

N

Y

N

Y

Y

N

 

项目资源目录截图:

bubuko.com,布布扣

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

bubuko.com,布布扣
1  PackageStore.AddPackage(new Uri("customtheme://"), Package.Open("123.zip"));
2 PackageStore.RemovePackage(new Uri("customtheme://")); 
bubuko.com,布布扣

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 加载的主题文件。

bubuko.com,布布扣
 1  public MainWindow()
 2         {
 3             InitializeComponent();
 4             //PackageStore.AddPackage(new Uri("customtheme://"), Package.Open("123.zip"));
 5             cmbThemes.ItemsSource = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Themes").EnumerateFileSystemInfos("*.customtheme", SearchOption.TopDirectoryOnly).Select((fi) => fi.FullName).ToList();
 6             
 7         }
 8 
 9         private void cmbThemes_SelectionChanged(object sender, SelectionChangedEventArgs e)
10         {
11             if (e.RemovedItems != null)
12             {
13                 foreach (var item in e.RemovedItems.OfType<string>())
14                 {
15                     PackageStore.RemovePackage(new Uri(System.IO.Path.GetFileName(item) + "://"));                                       
16                 }
17             }
18 
19 
20 
21             if (e.AddedItems != null)
22             {
23                 foreach (var item in e.AddedItems.OfType<string>())
24                 {
25                     Stream fileMapViewStream;
26                     try
27                     {
28                         //FileStream fs = File.Open(item.Replace("\\", ":"), FileMode.OpenOrCreate);
29                         fileMapViewStream = MemoryMappedFile.OpenExisting(item.Replace("\\", ":"), MemoryMappedFileRights.Read).CreateViewStream(0, new FileInfo(item).Length, MemoryMappedFileAccess.Read);
30                     }
31                     catch(IOException)
32                     {
33                         fileMapViewStream = MemoryMappedFile.CreateFromFile(item, FileMode.Open, item.Replace("\\", ":"), new FileInfo(item).Length, MemoryMappedFileAccess.Read).CreateViewStream(0, new FileInfo(item).Length, MemoryMappedFileAccess.Read); 
34                     }
35                     PackageStore.AddPackage(new Uri(System.IO.Path.GetFileName(item) + "://"), Package.Open(fileMapViewStream, FileMode.Open, FileAccess.Read));
36                     Application.Current.Resources.MergedDictionaries[0] = new ResourceDictionary() { Source = new Uri("pack://" + System.IO.Path.GetFileName(item) + ":,,,/ResourceDictionary.xaml") };
37                 }
38             }
39         }
bubuko.com,布布扣

 

WPF 动态加载主题由zip,布布扣,bubuko.com

WPF 动态加载主题由zip

原文:http://www.cnblogs.com/raohuagang/p/3644895.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!