WPF 动态加载主题由zip

经典主题的方式

主题战略

加载速度

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

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

支持资源层次结构中导航

动态加载

动态卸载

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

直接负载

快速

Y

Y

Y

Y

N

N

松散 Xaml

Y

N

Y

Y

Y

Y

AppDomain

快速

N

Y

N

Y

Y

N

项目资源目录截图:

WPF 动态加载主题由zip

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") };
}
}
}
上一篇:KISS


下一篇:mysql复制表结构create table as和like的区别