WPF 项目开发入门(一) 安装运行
WPF 项目开发入门(二) WPF 页面布局
WPF 项目开发入门(三)WPF 窗体与页面
WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件
WPF 项目开发入门(五)ListView列表组件 与 Expander组件
WPF 项目开发入门(六)DataGrid组件
WPF 项目开发入门(七) From表单组件
WPF 项目开发入门(八)数据库驱动配置与数据库操作
WPF 项目开发入门(九)数据库连接 NHibernate使用
WPF 项目开发入门(十)DevExpress 插件+NHibernate登录
WPF 项目开发入门(十一)DevExpress 插件 Grid表格应用
WPF开发中最常使用的是DevExpress 插件。下面实现一个DevExpress 插件+NHibernate 操作数据库开发一个简单的用户登录与菜单框架页面功能。
1 项目目录
|---db 数据库业务数据目录
|---page 系统子页面
|---App.xaml 启动设置
|---DXLogin.xaml 登录页面
|---DXMainWindow.xaml 后台框架页面
项目如果没有驱动,导入NuGet中数据库驱动 Oracle.ManagedDataAccess,FluentNHibernate ,NHibernate 到项目中来。
6.1 登录功能
1 创建用户表
create table SYS_USER(
USER_ID NUMBER not null,
DEPT_ID NUMBER,
LOGIN_NAME NVARCHAR2(30),
USER_NAME NVARCHAR2(30),
PASSWORD NVARCHAR2(50)
)
2 创建表POJO
public class UserMap : ClassMap<SysUserPojo>{
public UserMap() {
Table("SYS_USER");//映射表
//主键设置
Id(m => m.userid).Column("USER_ID").GeneratedBy.Assigned();
Map(m => m.loginname).Column("LOGIN_NAME");
Map(m => m.name).Column("USER_NAME");
Map(m => m.password).Column("PASSWORD");
}
}
public class SysUserPojo{
public virtual int userid { get; set; }
public virtual string name { get; set; }
public virtual string password { get; set; }
public virtual string loginname { get; set; }
//登录成功与失败判断
public virtual String mesages { get; set; }
}
HOracleDb 类中引入POJO
return FluentNHibernate.Cfg.Fluently.Configure()
.Database(OracleConfiguration.Oracle10
........ 导入 UserMap 配置类
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
.BuildSessionFactory();
3 登录DAO数据库业务类
public class SysLoginDao{
//用户登录判断
public SysUserPojo Login(string name,string passwrd) {
SysUserPojo user=null;
string sql = "select * from sys_user
where LOGIN_NAME='"+ name + "'";
List<SysUserPojo> ls= HOracleDb
.FindListSqlObj<SysUserPojo>(sql).ToList();
if (ls.Any()) {//判断是否查到用户信息
user=ls[0];
if (!passwrd.Equals(user.password)) {
//判断密码,密码错误为
user.mesages = "01";
}
}
return user;
}
//登录用户信息保存内存中
public static SysUserPojo getUserPojo =null;
}
4 登录页面DXLogin.xaml
<dx:ThemedWindow
x:Class="JMDJ.DXLogin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
dx:ThemeManager.ThemeName="Office2019Colorful"
HeaderBackground="DodgerBlue"
HeaderForeground="White"
ResizeMode ="NoResize" ----窗体大小不可变
Top="250" Left="500"
Title="登录" Height="170" Width="450">
<Grid>
<dxlc:LayoutControl Orientation="Vertical" Width="300" >
<dxlc:LayoutGroup Orientation="Vertical" >
<dxlc:LayoutItem Label="名称" >
<dxe:TextEdit NullText="请录入用户名称"
x:Name="name"
Width="150"/>
</dxlc:LayoutItem>
<dxlc:LayoutItem Label="密码" >
<dxe:PasswordBoxEdit
x:Name="paw"
ShowCapsLockWarningToolTip="True"
NullValue=""
NullText="请录入密码信息" Width="150"/>
</dxlc:LayoutItem>
</dxlc:LayoutGroup>
<dxlc:LayoutGroup Orientation="Horizontal" >
<dxlc:LayoutItem >
</dxlc:LayoutItem>
<dxlc:LayoutItem >
<dx:SimpleButton Width="100"
Height="22"
Content="登录"
Click="Login_Click" />
</dxlc:LayoutItem>
</dxlc:LayoutGroup>
<dxlc:LayoutGroup Orientation="Horizontal" >
<dxlc:LayoutItem >
<!------错误消息提示-------->
<TextBlock TextAlignment="Center"
VerticalAlignment="Center"
FontSize="20"
x:Name="megname" ></TextBlock>
</dxlc:LayoutItem>
</dxlc:LayoutGroup>
</dxlc:LayoutControl>
</Grid>
</dx:ThemedWindow>
5 DXLogin.CS 登录业务
public partial class DXLogin : ThemedWindow{
public DXLogin(){
InitializeComponent();
}
//登录数据库业务类
SysLoginDao dao = new SysLoginDao();
//登录数据模型
SysUserPojo user = null;
//登录事件
private void Login_Click(object sender, RoutedEventArgs e){
OnLogin();//业务判断
}
private void OnLogin() {
try{
//用户名称与密码验证
user = dao.Login(name.Text, paw.Text);
} catch (Exception eg){
//判断数据库操作是否正确
megname.Text = "数据库连接失败(联系管理员)";
return;
}
//判断用户是否正确
if (user == null){
megname.Text = "用户名称错误";
} else{
//判断密码是否正确
if ("01".Equals(user.mesages)){
megname.Text = "用户密码错误";
}else{
SysLoginDao.getUserPojo = user;//登录用户信息保存内存中
DXMainWindow win = new DXMainWindow();
win.Show();
this.Close();
}
}
}
}
6.2 菜单框架
用户登录成功之后查询数据库中的菜单表,获得系统菜单信息内容。
1 创建菜单表
create table SYS_MENU(
MUID NUMBER,
PMUID NUMBER,
NAME VARCHAR2(200),
IS_DEL VARCHAR2(1),
WPF_URL VARCHAR2(300),
WEB_URL VARCHAR2(300),
WPF_IMG VARCHAR2(300)
)
2 创建表POJO
public class SysMenuMap : ClassMap<SysMenuPojo>{
public SysMenuMap(){
Table("SYS_MENU");//映射表
Id(m => m.MUID).Column("MUID")
.GeneratedBy.Assigned();//主键设置
Map(m => m.PMUID).Column("PMUID");
Map(m => m.NAME).Column("NAME");
Map(m => m.IS_DEL).Column("IS_DEL");
Map(m => m.WPF_URL).Column("WPF_URL");
Map(m => m.WEB_URL).Column("WEB_URL");
}
}
public class SysMenuPojo{
public virtual int MUID { get; set; }
public virtual int PMUID { get; set; }
public virtual string NAME { get; set; }
public virtual string IS_DEL { get; set; }
public virtual string WPF_URL { get; set; }
public virtual string WEB_URL { get; set; }
}
HOracleDb 类中引入POJO
return FluentNHibernate.Cfg.Fluently.Configure()
.......
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<SysMenuMap>())
.BuildSessionFactory();
3 菜单生成数据库业务类
public class SysLoginDao{
public List<SysMenuPojo> getUserMeut() {
string sql = "select * from sys_menu where IS_DEL=0";
return HOracleDb
.FindListSqlObj<SysMenuPojo>(sql)
.ToList();
}
}
4 菜单架构DXMainWindow.xaml
<dx:ThemedWindow
x:Class="JMDJ.DXMainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxa="http://schemas.devexpress.com/winfx/2008/xaml/accordion"
xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui"
xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
dx:ThemeManager.ThemeName="Office2019Colorful"
HeaderBackground="#FF2A8AD4"
HeaderForeground="White"
Title="系统架构">
<Grid>
<dxlc:DockLayoutControl>
<dxlc:GroupBox
dxlc:DockLayoutControl.Dock="Top" Height="50" >
</dxlc:GroupBox>
<dxg:TreeViewControl x:Name="usermenu"----菜单组件
dxlc:DockLayoutControl.Dock="Left"
Width="170" FontSize="13"
TreeDerivationMode="Selfreference"
KeyFieldName="MUID"
ParentFieldName="PMUID"
TreeViewFieldName="NAME"
SelectedItemChanged="usermenu_SelectedItemChanged">----菜单事件
</dxg:TreeViewControl>
<dxwui:NavigationFrame ----业务页面组件
dxlc:DockLayoutControl.Dock="Client"
x:Name="zhttFrame"
AnimationType="SlideHorizontal"
NavigationCacheMode="Required">
<dxmvvm:Interaction.Behaviors>
<dxwuin:FrameNavigationService />
</dxmvvm:Interaction.Behaviors>
</dxwui:NavigationFrame>
</dxlc:DockLayoutControl>
</Grid>
</dx:ThemedWindow>
5 菜单架构DXMainWindow.CS业务类
public partial class DXMainWindow : ThemedWindow{
SysLoginDao dao=new SysLoginDao();
public DXMainWindow(){
InitializeComponent();
Window_Loaded();// 初始化设置全屏
//菜单数据生成组件
usermenu.ItemsSource = dao.getUserMeut();
}
// 设置全屏
private void Window_Loaded(){
// 设置全屏
this.Left = 0.0;
this.Top = 0.0;
this.Width = System.Windows.SystemParameters.PrimaryScreenWidth;
this.Height = System.Windows.SystemParameters.PrimaryScreenHeight;
}
//菜单点击事件
private void usermenu_SelectedItemChanged(
object sender,
DevExpress.Xpf.Grid.SelectedItemChangedEventArgs e){
SysMenuPojo meu=e.NewItem as SysMenuPojo;
if (meu!=null&& meu.WPF_URL!=null) {
//动态创建视图页面 例如:视图地址JMDJ.page.scgl.page1
Type type = Type.GetType(meu.WPF_URL);
object ojb = type.Assembly.CreateInstance(meu.WPF_URL);
zhttFrame.Content = ojb;
}
}
}
7 用户管理页面
在page 目录中创建用户管理视图页面,生成user.xaml与对应的user.cs业务代码。业务逻辑完成用户表的查询,添加,删除功能。
在sys_menu表中加入菜单信息内容,并将它的路径和程序地址关联。
MUID PMUID NAME WPF_URL
10000 0 系统管理 0
10001 10000 用户管理 JMDJ.page.user
user.xaml页面
<UserControl
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:dxlc="http://schemas.devexpress.com/winfx/2008/xaml/layoutcontrol"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxa="http://schemas.devexpress.com/winfx/2008/xaml/accordion"
xmlns:dxwui="http://schemas.devexpress.com/winfx/2008/xaml/windowsui"
xmlns:dxwuin="http://schemas.devexpress.com/winfx/2008/xaml/windowsui/navigation"
xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
mc:Ignorable="d"
d:DesignHeight="1000" d:DesignWidth="800">
<!--------------- 提示消息设置 -------------------->
<UserControl.Resources>
<DataTemplate x:Key="CustomNotificationTemplate">
<Border Background="DarkBlue"
BorderThickness="1" BorderBrush="Black">
<StackPanel Orientation="Vertical"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBlock HorizontalAlignment="Center" Text="{Binding}"
Foreground="LightGray" FontSize="16"
Margin="3" FontFamily="SegoeUI"/>
</StackPanel>
</Border>
</DataTemplate>
</UserControl.Resources>
<dxmvvm:Interaction.Behaviors>
<!--------------- 通知框 -------------------->
<dxwuin:FrameNavigationService x:Name="usermenu" />
<dxmvvm:NotificationService
x:Name="ServiceWithCustomNotifications"
CustomNotificationTemplate="{StaticResource CustomNotificationTemplate}"/>
</dxmvvm:Interaction.Behaviors>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="90" />
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<dxlc:FlowLayoutControl Orientation="Vertical"
Background="#FF2A8AD4"
BreakFlowToFit="True" Grid.Row="0">
<TextBlock Text="用户管理" FontSize="18"
oreground="#ffffff"/>
</dxlc:FlowLayoutControl>
<!--------------- 添加用户布局 -------------------->
<dxlc:LayoutControl VerticalAlignment="Stretch"
Orientation="Vertical"
Grid.Row="1"
x:Name="userFrom">-------绑定后台的用户数据模型
<dxlc:LayoutGroup Orientation="Horizontal" >
<dxlc:LayoutGroup Orientation="Vertical">
<dxlc:LayoutGroup Orientation="Horizontal"
VerticalAlignment="Top"
x:Name="imageGroup"
Margin="5">
<dxlc:LayoutItem Label="用户名称"
AddColonToLabel="True">
<dxe:TextEdit Text="{Binding name}"/>
</dxlc:LayoutItem>
<dxlc:LayoutItem Label="登录名称" A
ddColonToLabel="True">
<dxe:TextEdit Text="{Binding loginname}" />
</dxlc:LayoutItem>
<dxlc:LayoutItem Label="密码"
AddColonToLabel="True">
<dxe:TextEdit Text="{Binding password}" />
</dxlc:LayoutItem>
<dxlc:LayoutItem Width="300">
</dxlc:LayoutItem>
</dxlc:LayoutGroup>
<dxlc:LayoutGroup Orientation="Horizontal" >
<dx:SimpleButton Width="100" Height="22"
Content="添加"
Click="OnSave_Click" />---添加事件
</dxlc:LayoutGroup>
</dxlc:LayoutGroup>
</dxlc:LayoutGroup>
</dxlc:LayoutControl>
<!--------------- 列表部分 -------------------->
<dxg:GridControl Grid.Row="2" x:Name="usergird">
<dxg:GridControl.View>
<dxg:TableView AutoWidth="True"
ShowGroupPanel="False"/>
</dxg:GridControl.View>
<dxg:GridColumn FieldName="name" IsSmart="True" Header="用户名称" />
<dxg:GridColumn FieldName="loginname" IsSmart="True" Header="登录名称"/>
<dxg:GridColumn FieldName="password" IsSmart="True" Header="密码" />
<dxg:GridColumn Header="操作" >
<dxg:GridColumn.CellTemplate >
<DataTemplate >
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Center" >
<Button Content="删除" Click="OnDel_Click">----删除功能
</Button>
</StackPanel>
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
</dxg:GridControl>
</Grid>
</UserControl>
user.xaml业务代码
public partial class user : UserControl{
SysUserPojo userpojo = new SysUserPojo();
public Scgl_sb_wl01list(){
InitializeComponent();
//添加组件引入数据模块
userFrom.DataContext = userpojo;
//列表组件引入数据模块
usergird.ItemsSource = FindList();
}
//添加用户信息到SYS_USER表中
private void OnSave_Click(object sender,
RoutedEventArgs e) {
if (userpojo!=null) {
//添加数据
HOracleDb.Save<SysUserPojo>(userpojo);
ServiceWithCustomNotifications
.CreateCustomNotification("成功").ShowAsync();
usergird.ItemsSource = FindList();
//刷新列表
usergird.RefreshData();
}
}
//删除用户信心
private void OnDel_Click(object sender,
RoutedEventArgs e){
//获得表列中选中的信息内容
SysUserPojo up = usergird
.SelectedItem as SysUserPojo;
if (up == null) {
return;
}
//删除提升框
MessageBoxResult result =
WinUIMessageBox.Show(messageBoxText: "是否要删除数据信息",
caption: "提示信息",
button: MessageBoxButton.YesNo);
if (result == MessageBoxResult.Yes){
//删除信息
HOracleDb.Delete<SysUserPojo>(up);
ServiceWithCustomNotifications
.CreateCustomNotification("删除成功").ShowAsync();
usergird.ItemsSource = FindList();
//刷新列表
usergird.RefreshData();
}
}
//查询用户表
public List<SysUserPojo> FindList() {
return HOracleDb
.FindListSqlObj<SysUserPojo>(
"select * from sys_user order by user_id desc")
.ToList();
}
}