话不多说先上图

 点击下一步

 跳转到第二页

 项目准备:

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. JS 的JSON对象

    知识点一: 循环对象 for(x in Obj)  x表示属性,Obj.x表示属性的值. 修改值 Obj.x = "  "//直接修改 删除对象属性 delete Obj.x va ...

  2. 53. Maximum Subarray (JAVA)

    iven an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  3. 1134. Vertex Cover (25)

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...

  4. libevent 网络库安装

    ./configure prefix=/tools/libevent make sudo make install

  5. DevExpress v18.2版本亮点——Analytics Dashboard篇(一)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...

  6. 谷歌将用QUIC传输层技术加速互联网

    安全这个话题,要感谢斯诺登,过去的安全就是攻和防之间的关系,即我们用一种什么样的体系.架构和模式去构建一个密不可破的安全系统.” 对IETF工作组忽视外部观察者看起来是一件甚么微不足道的事情的能力感到 ...

  7. java定义时间

    import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat format=new SimpleDateForm ...

  8. 详解Spring MVC 集成EHCache缓存_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 废话少说,直接上代码: ehcache.xml 文件 <?xml version="1.0" ...

  9. [洛谷P2154] SDOI2009 虔诚的墓主人

    问题描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  10. 命令——tree

    tree——以树形结构显示目录文件 [root@centos71 ~]# yum provides tree Loaded plugins: fastestmirror Loading mirror ...