话不多说先上图

 点击下一步

 跳转到第二页

 项目准备:

1.DevExpress 19/18/17(三个版本都可以)

2.Vs2019

3..Net framework>4.0

项目结构:

 项目步骤:

1.导入项目所需的DLL

每个DLL的含义和作用可以去官网或者客户端工具查看

 2.构建主界面

DevExpress的导航控件具有跳转的功能,我们这里使用的就是DevExpress的NavigationFrame控件。

它存在DevExpress.Xpf.Controls的DevExpress.Xpf.WindowsUI命名空间下。

我们在主界面里面装入此控件,并且在控件内设置第一页指向的界面。

<dx:ThemedWindow x:Class="NextDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NextDemo"
mc:Ignorable="d"
ResizeMode="CanMinimize"
Title="腾讯QQ安装程序" Height="450" Width="800">
<Grid>
<dx:LoadingDecorator>
<dxwui:NavigationFrame x:Name="frame" Source="InstallStep1" BackNavigationMode="Root"//这里的source就是指向的界面的名字
AnimationType="SlideHorizontal"
AnimationSpeedRatio="1">
</dxwui:NavigationFrame>
</dx:LoadingDecorator>
</Grid>
</dx:ThemedWindow>

那么这里的Source属性是如何指向界面的呢?

其实它会根据名字去同一个命名空间下寻找同名的类,所以这里要确保你的界面要和主界面是一个命名空间,不然寻找失败,DevExpress就会将之转化为字符串进行展示

下图中,我们在Views文件夹中创建第一页显示的用户控件,并且将命名空间与主界面修改为一致

主界面对应后台代码

public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
//设置样式
ApplicationThemeHelper.UseLegacyDefaultTheme = true;
ApplicationThemeHelper.ApplicationThemeName = Theme.Office2019DarkGray.Name;
this.WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
this.BorderThickness = new Thickness();
this.Margin = new Thickness();
this.Padding = new Thickness();
this.Icon = new BitmapImage(new Uri("pack://application:,,,/Images/QQ.jpg"));
//绑定模型
var viewModel = new InstallViewModel();
viewModel.NavigatePage += frame.Navigate;//重点:绑定导航切换方法
this.DataContext = viewModel;
}
}

我们将NavigationFrame的导航切换事件绑定到我们视图模型上面,并且这是一个总的ViewModel,为什么不在每个界面里做这种操作

1.因为NavigationFrame控件在主界面中,如果我们在每一页都想去操作它,就得作为传输参数,提高了耦合

2.我们可以使每一页的视图模型都去继承MainWindow的视图模型,重写该事件,从而可以根据具体业务定制页面跳转,实现多态。(demo中并没有这样做。hhhhh)

 3.对第一个界面进行处理,我就稍微模仿了下一些程序的安装程序

直接上代码

<UserControl x:Class="NextDemo.InstallStep1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
xmlns:local="clr-namespace:NextDemo"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<dxmvvm:Interaction.Behaviors>
<dx:DXMessageBoxService/>
<dx:CurrentDialogService/>
</dxmvvm:Interaction.Behaviors>
<Grid>
<dxlc:LayoutControl VerticalAlignment="Stretch" Orientation="Vertical" TextBlock.FontSize="12">
<Label VerticalAlignment="Top" FontWeight="Bold" TextBlock.FontSize="14" Content="请同意我们相关的协议" Foreground="Black"></Label>
<dxlc:LayoutGroup Orientation="Horizontal">
<TextBlock TextWrapping = "Wrap">欢迎您使用腾讯QQ软件及服务</TextBlock>
</dxlc:LayoutGroup>
<dxlc:LayoutGroup VerticalAlignment="Bottom" Orientation="Horizontal">
<dxlc:LayoutGroup Orientation="Vertical" HorizontalAlignment="Left">
<dxe:CheckEdit Content="我同意" HorizontalAlignment="Left"/>
<dxe:CheckEdit Content="我不太同意" HorizontalAlignment="Left"/>
</dxlc:LayoutGroup>
<dxlc:LayoutGroup HorizontalAlignment="Right" VerticalAlignment="Bottom">
<dx:SimpleButton Content="下一步" Width="80" Height="20" FontWeight="Bold" Command="{Binding NextCommand}" VerticalAlignment="Bottom"></dx:SimpleButton>
<dx:SimpleButton Content="取消安装" Width="80" Height="20" Command="{Binding CancelCommand}" VerticalAlignment="Bottom"></dx:SimpleButton>
</dxlc:LayoutGroup>
</dxlc:LayoutGroup>
</dxlc:LayoutControl>
<dx:WaitIndicator DeferedVisibility="{Binding IsLoading}" />
</Grid>
</UserControl>

这里使用到了DevExpress自带的MVVM模式,不太了解的同学可以去官网或者我的文章了解下,其实和WPF自带的很像。

对"下一步"进行命令绑定。

WaitIndicator是WPF自带的一个加载中控件。我将之是否显示绑定到一个IsLoading属性。

4.处理业务,完成VIewModel

internal Action<string> NavigatePage;

这就是步骤二中绑定的导航的跳转事件对象

有了它我们就可以自由调用它,进行跳转。委托参数是跳转的视图的名字,同样也得是统一命名空间。

private void JumpToStepTwo()
{
//业务或者跳转判断
//....
//跳转到对应的命名空间下的用户控件
NavigatePage?.Invoke("IntallStep2");
}

对下一步就行命令绑定的实现

 public event Action NextAction;//跳转下一步的事件,
private async Task Next()
{
IsLoading = true;
try
{
await Task.Delay();//模拟业务耗时 NextAction?.Invoke();
}
catch(Exception ex) { throw ex; }
finally
{
IsLoading = false;
}
}
NextCommand = new AsyncCommand(Next);

这样下一步的功能就可以使用了,具体业务自己实现就行了。

ViewModel代码

public class InstallViewModel:ViewModelBase
{
bool _loading;
public bool IsLoading
{
get { return _loading; }
set { SetProperty(ref _loading, value,nameof(IsLoading) ); }
}
internal Action<string> NavigatePage;
//以下两个建议提交到基类中定义
public AsyncCommand NextCommand { get; set; }//下一步的命令
public event Action NextAction;//跳转下一步的事件,
//业务逻辑
public InstallViewModel()
{
NextCommand = new AsyncCommand(Next);
NextAction += JumpToStepTwo;
}
private async Task Next()
{
IsLoading = true;
try
{
await Task.Delay();//模拟业务耗时 NextAction?.Invoke();
}
catch(Exception ex) { throw ex; }
finally
{
IsLoading = false;
}
}
private void JumpToStepTwo()
{
//业务或者跳转判断
//....
//跳转到对应的命名空间下的用户控件
NavigatePage?.Invoke("IntallStep2");
}
}

最后提一下,就是下一步,上一步,取消,都应该提到一个基类视图模型中,然后继承,自己根据业务实现特定的功能。

代码已经上传GitHub

觉得有用的话给个星星吧ballball你们!!!

WPF与DevExpress之——实现类似于安装程序下一步下一步的样式窗体的更多相关文章

  1. 使用EXE4J和Inno Setup 编译器将java程序打包成windows桌面应用安装程序

    java项目结构如下: Demo是模仿程序快照,主要设计两个按钮:保存快照和恢复快照: 保存快照将对象(窗口)序列化保存下来,后面无论做了什么操作,只要点击恢复快照, 就会读取之前保存的序列化的对象. ...

  2. VS2019打包WPF安装程序最新教程

    VS2019打包WPF安装程序最新教程,使用Visual Studio 2019开发的WPF程序如果想要打包为安装程序,除了在VS2019找到WPF项目类库直接右键发布之外,更常用的还是将其打包为ex ...

  3. .net core 和 WPF 开发升讯威在线客服系统:把 .Net Framework 打包进安装程序

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 系列文章目录: https://blog.shengxunwei.com/Home/Post/44a3 ...

  4. VS2010制作网站自定义安装程序 转

    最近在把一个网站打包成安装程序,这方面的文章网上有很多,也看了不少,但因为开发环境的不同,遇到了一些问题,便写下这篇文章记下整个流程(有很多资源都来自互联网,由于条目颇多,所以无法说明其来处,敬请谅解 ...

  5. Linux安装程序Anaconda分析

    1.概述     Anaconda是RedHat.CentOS.Fedora等Linux的安装管理程序.它能够提供文本.图形等安装管理方式,并支持Kickstart等脚本提供自己主动安装的功能.此外, ...

  6. linux中安装程序及账户管理

    程序安装及管理 1. Linux 应用程序基础  Linux命令与应用程序的关系 1):文件位置 系统命令:一般在/bin和/sbin目录中,或为Shell内部指令 应用程序:通常在/usr/bin和 ...

  7. NSIS脚本 打包安装程序

    相关工具 nsis http://nsis.sourceforge.net/Special_Builds HM NIS Edit http://hmne.sourceforge.net/ 例子: ; ...

  8. 学会四招让你在linux下安装程序变得简单

    一.背景 由于最近想自己摸索一些linux下的东西,开始玩起了Linux系统,在安装软件的过程中有诸多的不解和困惑,现在终于搞明白了具体是怎么样的安装步骤和过程,先分享给你们同时也方便自己复习查阅. ...

  9. 制作Java安装程序

    这个工具利用 ANT 来制作在 Windows, MacOS X, Unix 平台上可执行的文件,比如 exe,zip,jar.ROXES ANT Tasks 基于 GPL 发布. http://ww ...

随机推荐

  1. 【React 6/100】 React原理 | setState | JSX语法转换 | 组件更新机制

    ****关键字 | setState | JSX语法转换 | 组件更新机制 组件更新机制 setState() 的两个作用 修改state 更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会 ...

  2. glup安装

    资料参考:http://www.w3ctrain.com/2015/12/22/gulp-for-beginners/ 1.在安装 node 的环境后: npm install gulp -g 全局安 ...

  3. FPGA引脚锁定 注意err和高阻状态

    1.fpga没有用的的管脚一定要设置成高阻状态设置路径如下: Assignmen->Device->Device&Pin Option->Unused pins->As ...

  4. 运用在伪类content上的html特殊字符

    原文转载于:https://www.cnblogs.com/wujindong/p/5630656.html 项目中用到的一些特殊字符和图标 html代码 <div class="cr ...

  5. Linux日常之以当前时间命名文件

    要求:将当前硬件信息的内容统一以一个文件的形式写入目录date中,且该文件是以“cpu_当前时间.txt”方式命名:    实现该要求主要理解三方面: (1) 显示当前硬件信息的命令:lscpu (2 ...

  6. postman(二):详解在Pre-request Script中如何执行请求

    一.这里以Pre-request Script标签来介绍 postman提供了postman提供了一个"Send a request"代码段,他是已经封装好的发送请求的方法 一个& ...

  7. CSP2019 前 随感

    因为博主并没有任何的 oi 水平.文化课水平以及作文水平,下面的东西都是对辞藻和古诗词的堆砌. 不知不觉又到了新一年的 noip 了. 好像是去年的双十一的晚上,noip 考挂的我绝望地写了 bzoj ...

  8. 连续处理函数reduce

    >>> def operat(x,y): return x*y >>> print reduce(operat,(1,2,3,4,5,6,7,8,9,10))362 ...

  9. React native 平时积累笔记

    常用插件: react-native-check-box 复选框react-native-sortable-listview 列表拖拽排序 react-native-doc-viewer 预览组件 r ...

  10. Solr分组查询

     项目中需要实时的返回一下统计的东西,因此就要进行分组,在获取一些东西,代码拿不出来,因此分享一篇,还是很使用的. facet搜索 /** * * 搜索功能优化-关键词搜索 * 搜索范围:商品名称.店 ...