學生管理系統(四)建立主界面
在建立模型之前,需要說一些關於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 文件,修改好基本的樣式,添加上關閉與最小化按鈕(最大化要改圖標,太麻煩先不搞)以及一個注銷按鈕,並添加好兩個按鈕的事件。
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,先讓我想想界面該做成什么樣(美工上線(誤
嗯畫好了
另外在WindowStyle=none 的時候,最大化的窗口會覆蓋任務欄,我查了一下,網上的方法基本都是用來Win32 API,我就偷個懶,只在MainWindow 的構造方法里加個最大高度限定好了。
1 public MainWindow() 2 { 3 InitializeComponent(); 4 this.MaxHeight = SystemParameters.WorkArea.Height; 5 }
最后是github:Github\LzxHahaha\EducationManager
轉載請注明出處:LzxHahaha-博客園