博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面
阅读量:6580 次
发布时间:2019-06-24

本文共 8288 字,大约阅读时间需要 27 分钟。

原文:

       在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果。另外ViewModel做了些调整,状态更加分明。安装效果是仿照搜狗输入法做的。先上效果图。

 

      以上这只是四个基本的页面,更细化一些可以分出卸载的进度页面,卸载的完成页面,对修复同理,还有安装失败,用户取消提示页面,再就是能检测新版本并覆盖安装,这些都可以根据状态去添加页面。下面简单的说下思路和新的问题点。

关键流程

     安装包运行之后,首先触发的重要的事件之一就是 DetectPackageComplete,Bootstrapper按照Bundle.wxs Chain里面Package的顺序来检测当前电脑是否安装了其中的程序。

   像这样,首先会判断是否安装了.Net4.0,但是在WPF程序里面我们需要判断的还是HeartBeats这个安装包。·

protected void DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)        {            PackageId = e.PackageId;            //对应的是MsiPackage Id="HeartBeats"            //MessageBox.Show(e.PackageId + e.State);            if (e.PackageId.Equals("HeartBeats", StringComparison.Ordinal))            {                State = e.State == PackageState.Present ? InstallState.Present : InstallState.NotPresent;                //State =  InstallState.NotPresent;            }        }

如果这个安装包的State等于 PackageState.Present 那说明当前电脑已经安装过了,那就要出现卸载和修复的界面,反之就是出现安装的界面(因此也可以控制用户不能直接卸载,可以让用户提交一些数据之后再卸载)。然后会执行PlanBegin->PlanComplete->

ApplyBegin->ApplyComplete. 从字面意思理解就是安装准备到执行完毕的过程。InstallState的值就是在这些事件中发生变化,这也是从进度条页面切换到完成页面的顺序。InstallState 为Applied就是安装完成了。

public enum InstallState        {            Initializing,            Present,            NotPresent,            Applying,            Cancelled,            Applied,            Failed,        }

其他的一些细节在前文里面有讲,这里就不再赘述。

安装界面布局

 这里的布局主要是四个Grid根据状态不断的切换。当然你可以添加更多的状态也展示不同的页面。

View Code

像安装页面对应的是InstallEnabled 属性,来决定是否显示。

public bool InstallEnabled        {            get { return State == InstallState.NotPresent; }        }
public InstallState State        {            get            {                return state;            }            set            {                if (state != value)                {                    state = value;                    Message = "Status: " + state;                    OnPropertyChanged("State");                    OnPropertyChanged("CompleteEnabled");                    OnPropertyChanged("ExitEnabled");                    OnPropertyChanged("CancelEnabled");                    OnPropertyChanged("InstallEnabled");                    OnPropertyChanged("ProgressEnabled");                    OnPropertyChanged("UninstallEnabled");                }            }        }

一些文字的修改直接写在InstallConfig里面

public static class InstallConfig   {       public static string SoftName = "HeartBeats";       public static string WebSite = "http://www.cnblogs.com/stoneniqiu/";       public static string IcoUrl = "../Resources/heart.ico";       public static string BkUrl = "../Resources/Slider/b1.png";       public static string SoftTitle = "HeartBeats2.0正式版 安装向导";       public static string InstallFinished = "HeartBeats2.0安装完成";   }

.Net安装

 这个问题的解决还得的感谢一位网友,WIX的很多问题困扰着我,就像《勿忘心安》那首歌里面唱的,“只是苦于这些问题无人交流,只好任凭生命去阻碍”。很多时候一个人思路有限,知识有限,没有交流很难解决问题。解决办法就是修改一下bundle文件。

如果是4.5就修改成

如果用原生的Bootstrap界面,这样写就行了。

对应的BootstrapperCore.config 稍微做一下修改。

在没有.Net4.0的时候会出现类似于如下的安装界面。完成之后再会启动WPF安装界面。不然WPF界面是跑步起来的。

设置安装路径

 这个功能就是讲WPF用户自定义的路径传递到MSI文件中去。分三步。

 1.去掉目录中的ProgramFilesFolder。

 在原来的模式下,我们的路径应该是这样的:目标目录下是ProgramFiles文件夹再是我们的软件目录。

 修改成:

我这是实验得来的结果,我的理解是ProgramFilesFolder对于Program Files或者Program Files(x86) 文件夹,有强制性,导致我们自定义的路径设置失败。

2.在Bundl.wxs文件中加入MsiProperty。

INSTALLFOLDER 对应的就是MSI安装包中的变量,也就是上一步骤中的 Directory。而[InstallFolder]是我们在Bundle中自定义的变量。接下来看最后一步。

3.Bing定并设置变量InstallFolder

 在ViewModel中定义一个InstallFolder属性

public string InstallFollder        {            get { return _installFollder; }            set            {                if (_installFollder != value && ValidDir(value))                {                    _installFollder = value;                    OnPropertyChanged("InstallFollder");                    model.SetTargetFolderPath(value);                }            }        }
private string TargetFolder = "InstallFolder";        public void SetTargetFolderPath(string path)        {            SetBurnVariable(TargetFolder,path);        }        public void SetBurnVariable(string variableName, string value)        {            BootstrapperApplication.Engine.StringVariables[variableName] = value;        }

改变的时候,先验证,再设置这个变量。

界面上直接绑定这个属性即可。

Installer4.5及vcredist安装

这是两个额外的知识点,有的电脑没有Installer4.5不能触发安装,没有vcredist 也会导致一些com注册失败。 

开发电脑太强大,测试电脑可能缺这个缺那个的,欢迎大家补充一些。

View Code

 小结

 QQ,搜狗,UC,360等等这些互联网巨头的安装包都蛮炫酷的,对卸载和升级都做的很细致精美,很多效果我想WPF是可以做到的,但是现在有些效果我还没有成功实现:

 1.炫彩滚动的进度条,想到用渐变,但效果不理想也就没有放上来。如果是css3,那是很好写的。像这些效果-->

  

 2.图片滚动。像Web里面的Slider一样,在显示进度条的时候放个三张介绍图片来回切换。这个我找到了一个,还没有套用到这个安装包中。

 3.安装软件的时候,用户需要打开用户许可或者安装向导,而这个除了用官网的网址,我想用文件来展示,比如html、txt。一般的WPF程序,复制到输出目录就可以了,但是在安装包中需要打开dll资源中的文件,这个不知道大家有什么办法。

   比如我的根目录下有一个文件,InstallGuid.Html文件。生成操作为Resource。

   

 在Hyperlink的事件中用

Process.Start(new ProcessStartInfo(filepath));

 打开这个文件,写相对路径是会报错找不到文件。

 以上三个问题,如有知道的园友还请不吝指教下。 

 需要Demo的同学 。

      我喜欢看书,也喜欢分享书籍(不限技术书籍),建了一个书山有路群,诚邀有兴趣的朋友加入q:452450927

        

     书山有路一起走,学海无涯是朋友。

 

你可能感兴趣的文章
浅谈Java中的对象和引用
查看>>
SQL 注入自我总结
查看>>
Linux线程
查看>>
Exchange Server 2013 系列八:邮箱服务器角色DAG实战
查看>>
一个有趣的命令
查看>>
我的友情链接
查看>>
已发布13集网站开发技术视频:http://blog.sina.com.cn/s/blog_67d27f340102vf7l.html
查看>>
Mysql ibdata 丢失或损坏如何通过frm&ibd 恢复数据
查看>>
MySQL数据库的优化(二)
查看>>
Deepin OS和WIN7双启动 花屏原因一例
查看>>
UIMenuController—为UITextField禁用UIMenuController功能
查看>>
Protobuf使用不当导致的程序内存上涨问题
查看>>
【原创】扯淡的Centos systemd与Docker冲突问题
查看>>
Spring+Mybatis多数据库的配置
查看>>
给大家推荐一个免费下载名称读写ntfs软件的地方
查看>>
在MySQL数据库建立多对多的数据表关系
查看>>
突然停电或死机导致没保存的文件怎么找回
查看>>
kudu
查看>>
jquery.validate.min.js表单验证使用
查看>>
在JS中捕获console.log的输出
查看>>