WPF 动态加载主题由zip
经典主题的方式
|
主题战略 |
加载速度 |
本机支持 (不需要额外的代码) |
支持代码为主题 (捆绑代码 & 资源成单独的文件) |
支持资源层次结构中导航 |
动态加载 |
动态卸载 |
轻松地编辑和编译 (不需要安装 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的更多相关文章
- 044. asp.net主题之三应用或禁用主题和动态加载主题
1.为单个页面指定主题可以将@Page指令的Theme或StyleSheetTheme属性设置为要使用的主题名称, 代码如下: <%@ Page Theme ="MyTheme&quo ...
- WPF动态加载3D 放大-旋转-平移
原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs 第二步:ModelVisual3DWithName.cs public class ModelVisual3DW ...
- WPF动态加载3D 放大-旋转-平移
第一步:新建WavefrontObjLoader.cs using System; using System.Collections.Generic; using System.Windows; us ...
- 044. asp.net主题之二为主题添加CSS样式和动态加载主题
1. 新建任意一个网站, 默认主页为Default.aspx, 增加一个App_Themes目录, 用于存储主题, 添加一个MyTheme的主题, 在MyTheme主题下添加一个样式表文件, 默认名称 ...
- ASP.NET加载主题和皮肤样式的各种方式
一.加载主题(皮肤.样式表)的多种方式 除了在页面指令中采用Theme或者StylesheetTheme为单个页面加载主题外,还可以通过配置文件为多个页面批量加载主题,另外,还可以通过改变页面的The ...
- WPF 3D动态加载模型文件
原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...
- [WPF学习笔记]动态加载XAML
好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...
- mvvm模式下在WPF项目中动态加载项目的程序集和类
在mvvm模式的wpf项目中有个需求需要去加载解决方案的程序集,并且根据程序集去动态加载当前程序集的类,做成下拉框形式. 效果: //全局定义 private ComboBox abList= nul ...
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
随机推荐
- 洛谷 P2285 [HNOI2004]打鼹鼠
题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气. ...
- 【Lintcode】013.strStr
题目: For a given source string and a target string, you should output the first index(from 0) of targ ...
- requirejs的打包工具r.js
不建议用命令行,还是用配置文件比较方便--build.js. 我的build.js文件内容大概如下: ( { appDir : './', baseUrl : './scripts', dir : ' ...
- python使用uuid生成唯一id或str
介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...
- 微信开放平台开发-授权、全网发布(PHP)
这两天做了微信开发平台的开发,梳理下... 浙江百牛信息技术bainiu.ltd整理发布于博客园 先看看授权的流程: 第一步:接收component_verify_ticket: 1.微信服务器每隔1 ...
- cassandra根据用户名密码登录cqlsh
修改conf目录下cassandra.yaml文件 authenticator: PasswordAuthenticator //将authenticator修改为PasswordAuthentic ...
- java 获取 HttpServletRequest 值 demo
private void getHttpServletRequestInfo(HttpServletRequest request){ try { StringBuilder stringBuilde ...
- Entity Framework5学习笔记
主要 是学习DbContext http://zzk.cnblogs.com/s?w=DbContext&t=b
- In-App Purchase Configuration Guide for iTunes Connect---(一)----Introduction
Introduction In-App Purchase is an Apple technology that allows your users to purchase content and s ...
- JAVA正则表达式之 Pattern介绍
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher. Pattern 一个Pattern是一个正则表 ...