你的分享就是我们的动力 ---﹥

【乱写代码骗人系列】ZJUT数据库大型实验

【乱写代码坑人系列】ZJUT数据库大型实验

学生管理系统(四)建立主界面

学生管理系统(一)建立项目

学生管理系统(二)项目规划

学生管理系统(三)建立数据库和登录

  在建立模型之前,需要说一些关于WPF 的东西。

  WPF 是MVVM 模式的,可以有效的将UI层与逻辑层分离,关于MVVM 的介绍可以看.NET MVVM设计模式简介。

  在WPF 中,UI层的代码一般是写在xaml(可以读作脏某,逐个字母的念也没人打你的,看你心情)文件中,XAML 也是标记语言,和HTML 类似,可以完成大部分的UI 绘制以及动画效果。在xaml 文件下都可以打开xaml.cs 文件,这个就是写后台C#代码的地方。和UI 交互的叫做事件,可以给控件注册事件,来响应各种操作。

  举个例子,在之前做的登录界面中,由于将窗口的边框都隐藏了,导致无法拖动,用户体验下降了一万倍 ,所以现在要给它重新加上拖动事件。

  现在xaml文件中,选中Window 控件(代码的第一行),在右尖括号之前加上代码

MouseLeftButtonDown="Window_MouseLeftButtonDown"

  VS 会自动的提示新建事件,然后在.cs 文件中加入事件。进入.cs 能看到最下方多了一个方法,在里面添加代码

        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }

  这样就完成了拖动的定义,用户体验又嘚啵嘚啵的高了。当然这里还涉及到了路由事件的问题,具体的可以看路由事件概述,这里不多说。

 

  接下来开始画主界面。

 

  WPF 绘图用的是设备无关尺寸,不会因为分辨率的不同而出现不同的显示效果。也就是说,都是按着固定的dpi 来进行绘制,如果画得太大就无法在小屏幕上完整的显示。

  一般来说我喜欢固定大小,因为这样方便,而且不会因为用户改变了窗口的尺寸而影响显示效果,但是绝大多数情况下,固定窗口尺寸是一种体验极其差的设定,用户用起来会呱的一下觉得浑身难受。所以,这里我只会固定最小的宽和高,使元素不会因为窗口太小而被隐藏。

  打开之前的MainWindow.xaml 文件,修改好基本的样式,添加上关闭与最小化按钮(最大化要改图标,太麻烦先不搞)以及一个注销按钮,并添加好两个按钮的事件。

  【乱写代码骗人系列】ZJUT数据库大型实验

 1     public partial class MainWindow : Window
 2     {
 3         public MainWindow()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void closeButton_Click(object sender, RoutedEventArgs e)
 9         {
10             Application.Current.Shutdown();
11         }
12 
13         private void miniSizButton_Click(object sender, RoutedEventArgs e)
14         {
15             WindowState = WindowState.Minimized;
16         }
17 
18         private void logout_Click(object sender, RoutedEventArgs e)
19         {
20             App.AppDbconnection.Resize();
21             new Login().Show();
22             this.Close();
23         }
24     }

  打开App.xaml.cs,添加对RememberMe 的读写,注意set 要设置为private 的,再加上一个Reset 方法来将设置还原为初始状态。

 1     public class AppDbConnection
 2     {
 3         // Other code ...
 4 
 5         public bool RemeberMe { get; private set; } = Settings.Default.remeberMe;
 6 
 7         public void Reset()
 8         {
 9             Settings.Default.Reset();
10             Settings.Default.Save();
11             AppConnectionString = Settings.Default.connectionString;
12             RemeberMe = false;
13         }
14     }

  回到Login.xaml.cs 中,修改构造方法和登录事件的代码。

 1         public Login()
 2         {
 3             InitializeComponent();
 4             if (App.AppDbconnection.RemeberMe)
 5             {
 6                 new MainWindow().Show();
 7                 this.Close();
 8             }
 9         }
10         private void loginButton_Click(object sender, RoutedEventArgs e)
11         {
12             var success = App.AppDbconnection.Login(uidTextBox.Text, pwsTextBox.Password, remeberMeCheckBox.IsChecked ?? false);
13             if (success)
14             {
15                 new MainWindow().Show();
16                 this.Close();
17             }
18             else
19                 MessageBox.Show("Something Wrong!");
20         }

  现在就可以在两个窗口之间欢快的切换了。

 

  回到MainWindow.xaml,先让我想想界面该做成什么样(美工上线(误

   嗯画好了

  【乱写代码骗人系列】ZJUT数据库大型实验

  另外在WindowStyle=none 的时候,最大化的窗口会覆盖任务栏,我查了一下,网上的方法基本都是用来Win32 API,我就偷个懒,只在MainWindow 的构造方法里加个最大高度限定好了。

1         public MainWindow()
2         {
3             InitializeComponent();
4             this.MaxHeight = SystemParameters.WorkArea.Height;
5         }

   最后是github:Github\LzxHahaha\EducationManager