热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Wix安装部署教程(十)来,用WPF做个漂亮的安装界面

    在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的

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

Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面 Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面

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

关键流程

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

    <Chain DisableRollback='yes'>
      <PackageGroupRef Id="Netfx4Full"  />
      <MsiPackage Id="HeartBeats" SourceFile="D:\SetUp\Main\TestWix\bin\Debug\zh-cn\WPFDemo.msi" Compressed="yes"  DisplayInternalUI="no" >
        <MsiProperty Name="INSTALLFOLDER" Value="[InstallFolder]"/>
      MsiPackage>
    Chain>

   像这样,首先会判断是否安装了.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根据状态不断的切换。当然你可以添加更多的状态也展示不同的页面。

        <Grid  Grid.Row="1" Background="White" Visibility="{Binding InstallEnabled,COnverter={StaticResource BooleanToVisibilityConverter}}"  >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="2*" />
                        <RowDefinition Height="*" />
                    Grid.RowDefinitions>
                    <Rectangle MouseLeftButtonDown="Background_MouseLeftButtonDown"  />
                    <StackPanel Grid.Row="0"  VerticalAlignment="Stretch"  Style="{StaticResource InstallGrid}" >
                        <StackPanel.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                <GradientStop Color="White" Offset="0" />
                                <GradientStop Color="AliceBlue" Offset="1" />
                            LinearGradientBrush>
                        StackPanel.Background>
                        <TextBlock HorizontalAlignment="Center"   Padding="10" FontSize="40" Foreground="#33CCFF" IsHitTestVisible="False"  Text="{Binding SoftName}" >TextBlock>
                        <Button Height="40"  HorizontalAlignment="Center" IsEnabled="{Binding IsAgree,UpdateSourceTrigger=PropertyChanged}"   Width="200" Style="{StaticResource BuleBt}" Command="{Binding InstallCommand}"  >立即安装Button>
                        <TextBlock  Foreground="Gray"   Padding="5 10 0 0" VerticalAlignment="Center"  HorizontalAlignment="Center" TextDecorations="{x:Null}">
                            <Hyperlink NavigateUri="http://www.cnblogs.com/stoneniqiu/" RequestNavigate="Hyperlink_OpenGuid"  > 
                                 <Label Content="安装指南" VerticalContentAlignment="Bottom" FontSize="13" Margin="0" Padding="0" Foreground="#666" >Label>
                            Hyperlink>
                        TextBlock>
                    StackPanel>

                    <Border  Grid.Row="1"  HorizontalAlignment="Left" Width="580" Height="110" VerticalAlignment="Top"  BorderBrush="Gainsboro"   BorderThickness="0 0 0 0">
                        <Grid Style="{StaticResource DirGrid}"   >
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                                <RowDefinition />
                            Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*">ColumnDefinition>
                                <ColumnDefinition Width="3*" >ColumnDefinition>
                            Grid.ColumnDefinitions>
                            <Label Grid.Row="0" Grid.Column="0" Content="安装位置:" HorizontalAlignment="Right" VerticalContentAlignment="Center" >Label>
                            <TextBox Grid.Column="1" Grid.Row="0" Width="280" Height="25" Background="White" Margin="10 5" HorizontalAlignment="Left" Text="{Binding InstallFollder,UpdateSourceTrigger=PropertyChanged}" >TextBox>
                            <Button  Grid.Column="1" Grid.Row="0" Width="50" Height="25" Style="{StaticResource BuleBt}" Margin="0 0 90 0" Name="SelectFile" Click="SelectFile_OnClick"  FontSize="14"  HorizontalAlignment="Right" >浏览Button>
                            <CheckBox Grid.Row="1" IsChecked="{Binding IsAgree,UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center"  Margin="10 0 0 0" >

                                <TextBlock  Foreground="Gray"   Padding="5 0 0 0" VerticalAlignment="Center"  TextDecorations="{x:Null}">
                         <Label Content="我已经阅读并最终接受:" VerticalContentAlignment="Bottom" FontSize="12" Margin="0" Padding="0" Foreground="Gray" >Label>
                    <Hyperlink NavigateUri="http://www.cnblogs.com/stoneniqiu/" RequestNavigate="Hyperlink_OnRequestNavigate"  > 
                         <Label Content="用户协议" VerticalContentAlignment="Bottom" FontSize="12" Margin="0" Padding="0" Foreground="DodgerBlue" >Label>
                    Hyperlink>
                                TextBlock>

                            CheckBox>

                            <Label Name="InstalLabel"  Grid.Column="0" Grid.ColumnSpan="2" Content="{Binding SpaceInfo,UpdateSourceTrigger=PropertyChanged}"  Foreground="Gray" HorizontalAlignment="Center" Grid.Row="2" Margin="5 0 0 0" />
                        Grid>
                    Border>
                Grid>

                <Grid  Grid.Row="1" Visibility="{Binding UninstallEnabled,COnverter={StaticResource BooleanToVisibilityConverter}}">
                    <Grid.Background>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <GradientStop Color="White" Offset="0" />
                            <GradientStop Color="WhiteSmoke" Offset="1" />
                        LinearGradientBrush>
                    Grid.Background>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition  Width="2*"/>
                        <ColumnDefinition  Width="*"/>
                    Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition  Height="35" />
                        <RowDefinition  Height="45"/>
                        <RowDefinition />
                        <RowDefinition Height="50" />
                    Grid.RowDefinitions>
                    <Label Grid.Row="1" Grid.Column="1" Content="请选择:"  HorizontalAlignment="Left"  VerticalAlignment="Top"  Foreground="Green"  FontSize="25" >Label>
                    <StackPanel Grid.Row="2" Grid.Column="1">
                        <Button    Content="卸载" IsDefault="True" HorizontalAlignment="Left" Margin="10 10" Height="35" Width="120" Style="{StaticResource BuleBt}"  Background="Tomato" Command="{Binding UninstallCommand}"  >Button>

                        <Button    Content="修复" IsDefault="True" HorizontalAlignment="Left" Margin="10 10" Height="35"  Width="120" Style="{StaticResource BuleBt}"  Command="{Binding RepairCommand}"  >Button>
                    StackPanel>
                    <TextBlock Grid.Row="3" Foreground="Gray" Grid.Column="0" Padding="5 0 0 0" VerticalAlignment="Center" Grid.ColumnSpan="2" TextDecorations="{x:Null}">
                         <Label Content="登陆官网了解更多:" VerticalContentAlignment="Bottom" FontSize="12" Margin="0" Padding="0" Foreground="Gray" >Label>
                    <Hyperlink NavigateUri="{Binding WebSite }" RequestNavigate="Hyperlink_OnRequestNavigate"  > 
                         <Label Content="{Binding WebSite}" VerticalContentAlignment="Bottom" FontSize="12" Margin="0" Padding="0" Foreground="Gray" >Label>
                    Hyperlink>
                    TextBlock>

                Grid>
View Code
推荐阅读
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
author-avatar
123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有